{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LARS正则化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果斯坦福大学的Bradley Efron, Trevor Hastie, Iain Johnstone和Robert Tibshirani没有发现它的话[1]，LARS(Least Angle Regression，最小角回归)可能有一天会被你想出来，它借用了[威廉·吉尔伯特·斯特朗（William Gilbert Strang）](https://en.wikipedia.org/wiki/Gilbert_Strang)介绍过的高斯消元法（Gaussian elimination）的灵感。\n",
    "\n",
    "<!-- TEASER_END -->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Getting ready"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "LARS是一种回归手段，适用于解决高维问题，也就是$p >> n$的情况，其中$p$表示列或者特征变量，$n$表示样本数量。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## How to do it..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先让我们导入必要的对象。这里我们用的数据集是200个数据，500个特征。我们还设置了一个低噪声，和少量提供信息的（informative）特征："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.datasets import make_regression\n",
    "reg_data, reg_target = make_regression(n_samples=200,n_features=500, n_informative=10, noise=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由于我们用了10个信息特征，因此我们还要为LARS设置10个非0的相关系数。我们事先可能不知道信息特征的准确数量，但是出于试验的目的是可行的："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Lars(copy_X=True, eps=2.2204460492503131e-16, fit_intercept=True,\n",
       "   fit_path=True, n_nonzero_coefs=10, normalize=True, precompute='auto',\n",
       "   verbose=False)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import Lars\n",
    "lars = Lars(n_nonzero_coefs=10)\n",
    "lars.fit(reg_data, reg_target)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以检验一下看看LARS的非0相关系数的和："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sum(lars.coef_ != 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "问题在于为什么少量的特征反而变得更加有效。要证明这一点，让我们用一半数量来训练两个LARS模型，一个用12个非零相关系数，另一个非零相关系数用默认值。这里用12个是因为我们对重要特征的数量有个估计，但是可能无法确定准确的数量："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Lars(copy_X=True, eps=2.2204460492503131e-16, fit_intercept=True,\n",
       "   fit_path=True, n_nonzero_coefs=12, normalize=True, precompute='auto',\n",
       "   verbose=False)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_n = 100\n",
    "lars_12 = Lars(n_nonzero_coefs=12)\n",
    "lars_12.fit(reg_data[:train_n], reg_target[:train_n])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Lars(copy_X=True, eps=2.2204460492503131e-16, fit_intercept=True,\n",
       "   fit_path=True, n_nonzero_coefs=500, normalize=True, precompute='auto',\n",
       "   verbose=False)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lars_500 = Lars() #默认就是500\n",
    "lars_500.fit(reg_data[:train_n], reg_target[:train_n])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在，让我们看看拟合数据的效果如何，如下所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "18.607806437043894"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(np.power(reg_target[train_n:] - lars.predict(reg_data[train_n:]), 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "529.97993250189643"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(np.power(reg_target[train_n:] - lars_12.predict(reg_data[train_n:]), 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.3236770314162846e+34"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(np.power(reg_target[train_n:] - lars_500.predict(reg_data[train_n:]), 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "仔细看看这组结果；测试集的误差明显高很多。高维数据集问题就在于此；通常面对大量的特征时，想找出一个对训练集拟合很好的模型并不难，但是拟合过度却是更大的问题。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## How it works..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "LARS通过重复选择与残存变化相关的特征。从图上看，相关性实际上就是特征与残差之间的最小角度；这就是LARS名称的由来。\n",
    "\n",
    "选择第一个特征之后，LARS会继续沿着最小角的方向移动，直到另一个特征与残差有同样数量的相关性。然后，LARS会沿着两个特征组合的角度移动。如下图所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVkAAALUCAYAAAChNEFAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt8zvX/x/HHyzDNMYdUUg6JDhQxhMxXId8SSg5JKDl2\nIufTOlHfEqPQSd/qW5TKodIcYqEScgpzGClzGLMZNrPT+/fHtV2/bc12bbuu63MdXvfbbTe73tfH\ndb0+bK999vy8P++PGGNQSinlGiWsLkAppXyZNlmllHIhbbJKKeVC2mSVUsqFtMkqpZQLaZNVSikX\n0iarlFIupE1WuZ2IHBGRGBEJyjb2pIisc/L7hIrIp858TaUKS5usskoJ4Fmri1DK1bTJKisY4E3g\nBRGpmNcGInKXiGwRkbMisllEWl7uxURkrIhEi8g5EdknIv8SkU7AeKCniJwXke2Z21YUkQ9F5Hjm\n33lZREpkPtdfRH4WkTmZ7xspIv/K9j79ReRQ5vscFpE+zvxHUb5Jm6yyylYgAngh9xMiUhn4HpgF\nVAbeAr7PHM+9bX1gONDUGFMB6AAcMcaEA9OARcaY8saYxpl/5b9AClAXaJy5/ZPZXjIYiAKqAFOB\nb0SkkoiUBcKATpnv0xLYUZx/AOUftMkqqxhgCvC0iFTN9dy/gf3GmM+MMRnGmEXAPuCBPF4nHQgE\nbhWRUsaYv40xhzOfk8wP2wOR6sB9wPPGmIvGmNPYGnmvbK93yhgTZoxJN8Z8CewH7s+sNwNoKCJX\nGGNijDF7i/lvoPyANlllGWPMHuA7YBy2JpblWuDvXJv/BdTI4zWigOeAUCBGRBaKyDWXecsbgFLA\nCRGJF5F4YD5QLds2x/J432uMMUlAT2AIcFxEvss8ilYqX9pkldWmAoPI2UCPYWuI2d0AROf1AsaY\nhcaYNpnbGOD1rKdybXoUuARUMcZcmflR0RjTMNs2uRv5DcDxzPdZZYzpAFyN7cj6fQf2T/k5bbLK\nUsaYQ8AX5Jxp8ANwk4j0FpGSItITaIDtqDcHEbkp80RXILYGmowtQgA4CdQSEcl8rxPAKuAtESkv\nIiVEpK6I3J3tJa8SkWdEpJSI9ADqAytE5CoReTAzm00FErO9j1KXpU1WeYKXgCAyjzyNMWew5aCj\ngFhsJ8fuN8bE5fF3A4HpwGngBFAV26wCgMWZf54Rka2Zn/cDSgN7gbjMba7O9nq/AfUyX+9l4GFj\nTDy275XnsR1lnwHaAEOLs9PKP4gu2q2UjYj0B57IjB6Ucgo9klVKKRfSJqvU/zP882SZUsWicYFS\nSrmQHskqpZQLlXTXG4mIHjIrpXyWMUbyGnfrkawxxqc/pk6dankNuo+6f7qP7t/H/GhcoJRSLqRN\nVimlXEibrBOFhIRYXYLL+fo++vr+ge6ju7ltCpeIGHe9l1JKuZOIYDzhxJdSSvkbbbJKKeVC2mSV\nUsqFtMkqpZQLaZNVSikX0iarlFIupE1WKaVcSJusUkq5UIFNVkQWiEiMiPyRzzazReSgiOwUkcbO\nLVEppbyXI0eyHwGdLvekiHQGbjTG1AOeAuY5qTallPJ6BTZZY8wGID6fTboAH2du+xtQSUSqO6c8\npZTybs7IZGsAR7M9jgauc8LrKqWU13PWia/cCyPoSjBKKYVzbj9zDKiZ7fF1mWP/EBoaav88JCTE\no5YjU0opR0VERBAREeHQtg4tdSgitYBvjTEN83iuMzDCGNNZRFoAs4wxLfLYTpc6VEr5pPyWOizw\nSFZEFgJtgaoichSYCpQCMMa8a4xZISKdRSQKSAQGOK90pZTybrpot1JKFZMu2q2UUhZxxokvpVwm\nPT2dL774gsOHD1OzZk02b97MqFGjqFOnjtWlKeUQPZJVHm3nzp089NBD1KlTh4yMDHr06ME111xj\ndVlKOUybrPJoTZo0ITAwkF9//dU+7W/Pnj389NNP/Oc//7G6PKUKpE1WebQtW7YQGxvL7t27qV27\nNuvXr2fr1q00b96c2NhYLly4YHWJSuVLM1nl0cLDw6levTqtWrViyZIlVK1alSFDhpCenk5aWhrl\nypWzukSl8qVTuJRX+vzzz+nQoQMVK1akVKlSVpej/Fx+U7i0ySqv8/HHH7N+/XpKlCjB/PnzCQgI\nsLok5ee0ySqllAvpxQjKYxhjOHHihNVlKOU22mSV2xw/fpz77ruPDRs2WF2KUm6jTVa5nDGGjz76\niPr167Ny5UqCg4OtLkkpt9FMVrnUsWPH6Nu3L1u2bCExMZHy5cuTkJCASJ7xlVJeSTNZ5XbGGBYs\nWECDBg3YuHEjiYmJgO0KLm2wyp/oxQjK6bKOXn/++WdSU1Pt4yVLlqR9+/YWVqaU++mRrHK6ixcv\n0qZNG/tCLllHrkFBQbRs2dLK0pRyO22yyuluvPFGXnrpJYYPHw5Av379uP766zl//jzNmjWzuDql\n3EtPfCmX2LNnD7fddhsPP/wwixcvBuDQoUPUrVvX4sqUcj694ku51cWLFwkKCgJsi26XKKG/MCnf\nprMLlFvdeOONAJw6dUobrPJ7+h2gnOr111/n+PHjrFixgmrVqlldjlKW07hAOc3u3btp2LAhPXr0\n4Msvv7S6HKXcRjNZ5XKawyp/ppmscrmsu8eePn1aG6xS2eh3gyq21157jZMnT/LDDz9QtWpVq8tR\nyqNoXKCKJSuH7dmzJ4sWLbK6HKUsoZmscomkpCTKli0LaA6r/JtmssolNIdVqmD6naGKZNq0acTE\nxGgOq1QBCmyyItJJRPaJyEERGZvH81VFJFxEdojIbhHp75JKlcfYvXs3EydOpFevXnTq1MnqcpTy\naPlmsiISAOwH7gGOAVuA3saYyGzbhAKBxpjxIlI1c/vqxpi0XK+lmawP0BxWqX8qTiYbDEQZY44Y\nY1KBRcCDubY5AVTI/LwCcCZ3g1W+o3bt2oDmsEo5qqA7I9QAjmZ7HA00z7XN+8BaETkOlAcecV55\nypO8+uqrnDp1ivDwcM1hlXJQQYcijvx+PwHYYYy5FrgDeEdEyhe7MuVR/vjjDyZNmkTv3r3p2LGj\n1eUo5TUKOpI9BtTM9rgmtqPZ7O4CXgUwxhwSkT+B+sDW3C8WGhpq/zwkJISQkJBCF6zcLykpiUaN\nGgHwv//9z+JqlLJeREQEERERDm1b0ImvkthOZLUHjgOb+eeJr7eABGPMiyJSHfgdaGSMicv1Wnri\ny0tVq1aN2NhYYmNjqVKlitXlKOVx8jvxle+RrDEmTURGACuBAOBDY0ykiAzOfP5dYBrwkYjsxBY/\njMndYJX3evnll4mNjWXlypXaYJUqAr2sVl3Wrl27uP322+nTpw+fffaZ1eUo5bF07QJVaDofVinH\n6doFqtCuv/56AGJjY7XBKlUM+t2j/uGll17izJkzrFq1SnNYpYpJ4wKVQ1YO++ijj+p0LaUcpJms\ncojmsEoVjWayyiE1a9quO9EcVinn0e8kBcCLL75IXFyc5rBKOZnGBYqdO3dyxx130LdvXz799FOr\ny1HK62gmqy4rMTGRcuXKAZCRkYFInl8nSql8aCarLisrhz1z5ow2WKVcQJusHwsNDSU+Pp7Vq1dT\nuXJlq8tRyidpXOCnduzYQePGjXnsscf45JNPrC5HKa+mmazKQXNYpZxLM1mVw3XXXQdoDquUO2iT\n9TNTp07l7NmzrFmzRnNYpdxA4wI/kpXD9uvXj48//tjqcpTyGZrJKs1hlXIhzWQVNWrUADSHVcrd\ntMn6gSlTppCQkMCPP/6oOaxSbqZxgY/bvn07TZo0oX///nz00UdWl6OUT9JM1k9pDquUe2gm66eu\nvfZaQHNYpaykTdZHTZ48mXPnzmkOq5TFNC7wQdu2bePOO+9kwIABLFiwwOpylPJ5msn6kQsXLlC+\nfHlAc1il3EUzWT9hjOHqq68GIC4uThusUh5Am6wPmTx5MomJiaxdu5Yrr7zS6nKUUmhc4DOyctiB\nAwfy4YcfWl2OUn5FM1kfpzmsUtYqViYrIp1EZJ+IHBSRsZfZJkREtovIbhGJKGa9qhA0h1XKs5XM\n70kRCQDeBu4BjgFbRGS5MSYy2zaVgHeAjsaYaBGp6sqCVU4TJ04kMTGRdevWaQ6rlAcq6Eg2GIgy\nxhwxxqQCi4AHc23TB/jaGBMNYIyJdX6ZKi+///4706dP54knniAkJMTqcpRSeSioydYAjmZ7HJ05\nll09oLKIrBORrSLymDMLVHm7cOECTZs2BeD999+3uBql1OXkGxcAjpypKgU0AdoDQcCvIrLJGHMw\n94ahoaH2z0NCQvToq4iMMVSvXh3QHFYpK0RERBAREeHQtgU12WNAzWyPa2I7ms3uKBBrjLkIXBSR\n9cDtQL5NVhXdxIkTSUpKIiIiQnNYpSyQ+yDxxRdfvOy2BcUFW4F6IlJLREoDPYHlubZZBrQWkQAR\nCQKaA3uLULdywNatW5k+fTpPPvkkbdu2tbocpVQBCpwnKyL3AbOAAOBDY8x0ERkMYIx5N3ObF4AB\nQAbwvjFmdh6vo/Nki0nnwyrlmfRiBB9gjCEoKIjk5GTi4+OpVKmS1SUppTLpAjE+YMKECSQnJxMR\nEaENVikvokeyXmDr1q00a9aMQYMG8d5771ldjlIqF40LvNj58+epUKECoDmsUp5K4wIvZYzhqquu\nAiA+Pl4brFJeSJusBxs3bhzJycn89NNPmsMq5aU0LvBQW7ZsITg4mMGDBzN//nyry1FK5UMzWS+j\nOaxS3kUzWS9ijKFatWqA5rBK+QJtsh5m7NixXLp0ifXr12sOq5QP0LjAg2zevJnmzZszZMgQ5s2b\nZ3U5SikHaSbrBTSHVcp7aSbr4YwxVKlSBYCzZ89qg1XKh2iT9QBjxowhNTWVDRs2ULFiRavLUUo5\nkcYFFsvKYYcOHcrcuXOtLkcpVQSayXoozWGV8g2ayXogY4z91jGawyrlu7TJWmT06NGkp6ezceNG\nzWGV8mHaZC3w22+/MWPGDIYPH06rVq2sLkcpr7F7925eeeUVNm3aBED//v2tLcgB2mTd7Pz587Ro\n0QKAOXPmWFyNUt4lKSmJUqVKYYwhMjLSfgm6J9Mm60aawypVPMHBwWzbto2WLVuyadMmr/hNUJus\nG73wwguawypVTEFBQQBs2rSJli1bWlxNwbTJusmmTZt46623GDFihFf89FXKU11//fUsXryY33//\nnerVq1tdToF0nqwbnDt3zn7kqvNhlSq6Dz74gLp161KjRg2WLl3KmDFjrC4J0IsRLGWMISAgAGMM\nZ8+e1ZhAqWJYuXIlKSkpxMTEMHDgQEqU8IxfxvNrsiXdXYy/GTVqFMYYzWGVcoKOHTtaXUKhecaP\nAR+1adMmZs6cydNPP605rFJ+SuMCF9EcVin/oWsXuJkxxt5gdT6sUv5NM1kXGDlyJAC//PKL5rBK\n5WKMITExkfj4eOLi4oiPj7d/lC1blp49e1pdolMVGBeISCdgFhAAfGCMef0y2zUDfgUeMcZ8k8fz\nfhEX/Prrr9x1110888wzhIWFWV2OUh4hPT2df//73/z8889cvHgREaF06dKULFkSEeHixYukpKTQ\nunVrNmzYYHW5hVbkKVwiEgDsB+4BjgFbgN7GmMg8tlsNJAEfGWO+zuO1fL7Jag6r1OWtX7+ee++9\nl5SUlBzjpUuXpkyZMsycOZMBAwZ45fdNcTLZYCDKGHPEGJMKLAIezGO7p4GvgNPFqtSLZc9hExIS\nvPILRSlnS09PZ9WqVdSvX5+2bdv+o8FeccUV9OjRg8OHDzNw4ECf/L4pqMnWAI5mexydOWYnIjWw\nNd6se1j79uHqZTz//POALYfNutuBUv7o3LlzzJgxAxGhZMmSdOzYkQMHDtCrVy/++OMPatSoQWBg\nIHXq1GHNmjX873//s99I1BcVdOLLkYY5CxhnjDFi+zF02R9FoaGh9s9DQkIICQlx4OU93y+//EJY\nWBjPPvusVyxYoZSzHTp0iEmTJrFo0aIc42+++SaDBg3KceDx1VdfsXHjRp577jlKlvTOc+8RERFE\nREQ4tG1BmWwLINQY0ynz8XggI/vJLxE5zP831qrYctlBxpjluV7LJzNZzWGVP0pPT2fNmjU8/fTT\nHDx40D5er1495syZwz333ENAQICFFbpXcU58lcR24qs9cBzYTB4nvrJt/xHwrb/MLjDG2K+dTkhI\n0JhA+bRz587x3nvvMXr06BzjvXv35uWXX6Zu3boWVWa9Iq9dYIxJE5ERwEpsU7g+NMZEisjgzOff\ndXq1XuS5554DbNO2tMEqXxQVFcWkSZP44osvcozPmDGDJ598Ur/uHaCX1RbRL7/8QqtWrXjuueeY\nOXOm1eUo5RTp6emsXr2aESNGcOjQIft4/fr1mT17Nu3bt/erGMBRutShkyUkJFCpUiVEhPT0dM1h\nlVdLSEjgvffe+8farI8++igvvfQSderUsagy76FLHTqRMYZKlSoBui6B8l4HDx5k0qRJfPnllznG\nZ86cyRNPPEH58uUtqsz3aJMtpGeeeQbQHFZ5l6yLAkaMGMHhw4ft4zfffDOzZ8+mXbt2GgO4iK7C\nVQg///wzb7/9Ns8//7z9tt5KeaqEhARef/11+0UBnTt35vDhw/Tr14/Dhw9jjGHv3r1+N93K3TST\ndVBWDluiRAnS0tI0JlAe6cCBA0ycOJGvvvoqx/isWbMYOHCgxgAuoplsMWXPYePj47XBKo+RlpbG\nypUrGTFiBEeOHLGPawzgOTQucMDTTz8N2G4nozmsslpCQgKvvfYaIkKpUqW4//77OXLkiMYAHkqP\nZAuwceNG3nnnHUaOHEnz5s2tLkf5qf379zNx4kS+/jrnKqJhYWEMGDBAYwAPpplsPrJy2ICAAFJT\nUzUmUG5zuRjg1ltvJSwsjHbt2nnM7bCV3uOrSDSHVe6WkJDA9OnT/xED9O/fnz///BNjDLt376Z9\n+/baYL2IxgWXkZXD/vbbb/qrmHKZ/fv3M2HCBL75JueaSrNnz2bAgAGUK1fOosqUs2iTzUNWDjtq\n1CiCg4OtLkf5kLS0NMLDwxk+fDh///23fbxhw4aEhYXRtm1bPUr1MZrJ5nL27FmuvPJKSpUqxaVL\nlzQmUMV29uxZ3nnnHSZNmpRjfMCAAUydOpUbbrjBosqUs+gCMQ7Kvj7suXPnNCZQRbZv3z7Gjx/P\n0qVLc4y//fbbPP744xoD+Bi9GMFBw4YNA2Dz5s3aYFWhpKWlsWLFCoYPH050dLR9vFGjRoSFhXH3\n3XdrDOCn9H8904YNG5g/fz6jR4+mWbNmVpejvEB8fDyvvPKKfTbAgw8+SHR0NAMHDuTIkSMYY9i5\ncychISHaYP2YxgVoDqscFxkZyfjx41m2bFmO8XfeeYfHH3+csmXLWlSZspJmsvnQHFblJy0tje+/\n/57hw4dz7Ngx+/jtt99OWFgYbdq00aNUpRcj5Gfo0KGA5rDq/8XHx/Pyyy/bY4CuXbty7Ngxnnji\nCf766y+MMezYsUOnWymH+PWJr/Xr1/Puu+8yZswYzWH9XGRkJOPGjWP58hx3smfu3Ln069dPYwBV\nZH4bF2TlsIGBgVy8eFFzWD+TmppqjwGOHz9uH2/cuDGzZs2idevWepSqHKaZbC7Zc9jz58/rnEU/\nER8fz5w5c5g6dWqO8UGDBjF58mRq1qxpUWXK2+k82VyGDBkC2HJYbbC+bc+ePYwbN47vvvsux/j8\n+fPp27evxgDK5fyuya5fv95++2PNYX1Pamoq3333HcOGDePkyZP28SZNmjBr1ixatWqlMYByK7+K\nC7Jy2DJlypCUlKQ5rI+Ii4tj9uzZvPjiiznGn3rqKSZPnsx1111nUWXKX2gmi+awvsQYw549exg7\ndiwrVqywj4uIPQYICgqysELlbzSTBQYPHgzA1q1btcF6odTUVJYvX87w4cOJiYmxjzdt2pSZM2dy\n1113aQygPJJffFX+9NNPvP/++4wbN44777zT6nKUg86cOcPUqVMREUqXLs3DDz9MTEwMgwcP5ujR\noxhj2LJli063Uh7NobhARDoBs4AA4ANjzOu5nn8UGAMIcB4YaozZlWsbS+ICzWG9R9btVcaNG5cj\nBihRogTz58/n0Ucf1RhAeaRiZbIiEgDsB+4BjgFbgN7GmMhs27QE9hpjEjIbcqgxpkWu13F7k9Uc\n1vNlxQDDhg3j1KlT9vFmzZrZYwD9wag8XXHXLggGoowxR4wxqcAi4MHsGxhjfjXGJGQ+/A3wiNO5\ngwYNAjSH9TRnzpxhypQpOWKAU6dOMXToUKKjozHGsHnzZlq1aqUNVnk9R0581QCOZnscDTTPZ/sn\ngBX5PO8WERERfPjhh4wfP15zWItlxQBjxowhPDzcPl6yZEnmzZtHnz59NAZQPsuRJuvw7/gi0g4Y\nCLQqckVOEB8fT7t27QgKCuLVV1+1shS/lZKSwvLlyxk6dCixsbH28eDgYGbOnEnLli31KFX5BUea\n7DEg+0XdNbEdzeYgIo2A94FOxpj4vF4oNDTU/nlISAghISGFKNUxxhgqV64MQExMjH4ju9GZM2eY\nOXPmP36wDRs2jIkTJ3LttddaVJlSzhUREUFERIRjGxtj8v3A1ogPAbWA0sAO4OZc21wPRAEt8nkd\n4w5PPPGEAczWrVvd8n7+LCMjw+zYscN06NDBYPuNxwCmVKlS5oMPPjBJSUlWl6iUW2T2tzx7X4FH\nssaYNBEZAazENoXrQ2NMpIgMznz+XWAKcCUwL/PIMdUYE+xYm3eedevW8eGHHzJhwgTNYV0kJSWF\npUuXMmzYMM6cOWMfb9GiBW+99RYtWrTQ3x6UysZnLquNj4+ncuXKlCtXjnPnzuk3uhPFxsYyc+ZM\npk2blmN8+PDhTJgwQWMA5fd8fu0Ck20+7IULF3T5umIymXdZHTNmDKtXr7aPly5dmnnz5tG7d2+u\nuOIKCytUyrP4/NoFTz75JAC///67NtgiSklJYcmSJQwbNoy4uDj7eMuWLXnrrbdo3ry5/nagVBF4\n/QXf69atY8GCBUycOJEmTZpYXY5XiY2NZcKECYgIgYGB9OrVi7i4OJ5++mmOHz+OMYZffvlFc1al\nisGr44K4uDiqVKmiOayDsmKA0aNHs2bNGvt4mTJlmDdvHj179tQYQKki8MlMVnNYx6SkpPDNN98w\ndOhQzp49ax9v1aoVM2bMIDg4WH84KVVMxV27wCMNHDgQgG3btmmDzeX06dOMGzfOHgP07t2bs2fP\n8swzz9hjgI0bN2rOqpQbeOWJr7Vr1/Lf//6XSZMm0bhxY6vLsZwxhh07djB69Gh+/PFH+/gVV1xh\njwHKlCljYYVK+S+viwuyctgKFSqQkJBQ8F/wUZcuXbLHANn/HVq3bs2MGTNo1qyZHqUq5SY+k8n6\new57+vRp3njjDd54440c48899xxjx47l6quvtqgypfybz8yTHTBgAOA/Oawxhm3btjF69GjWrVtn\nHy9btixz587lkUce0RhAKQ/nNU32xx9/5OOPP2by5Mk+ncNeunSJr7/+mqFDh3Lu3Dn7eJs2bZgx\nYwZNmzbVGEApL+IVcUFWDlupUiXi4/NcRdGrnTp1ijfffPMfMcDzzz/PmDFjNAZQysN5dSbrizls\nVgzwwgsv5FiTsmzZssybN48ePXpoDKCUF/HqTLZ///4AbN++3asb7KVLl/jqq68YMmQIFy5csI+3\nbduWN998kzvvvFNjAKV8kEdfjPDjjz/yySefMGXKFO644w6ryym0U6dOMWrUKESEMmXK0LdvXy5c\nuMDIkSM5efIkxhgiIiI0Z1XKh3lsXHDmzBmqVq3qVTmsMYbff/+dUaNGsX79evt4uXLlmD9/Pg8/\n/DCBgYEWVqiUcgWvy2S9KYe9dOkSX375JUOHDiUxMdE+HhISwptvvkmTJk30KFUpL5Kens4XX3zB\n4cOHqVmzJps3b2bUqFHUqVPnsn/H69Yu6NevHwA7duzwyAYbExPDyJEj7TFAv379SExMZPTo0cTE\nxGCMYd26dZqzKuWFdu7cyUMPPUSdOnXIyMigR48eXHPNNUV/wcvd/MvZHzh4I8XVq1cbwISGhjq0\nvTtkZGSYzZs3mzZt2uS4YWCFChXMZ599ZpKTk60uUSnlZCNGjDCHDx+2P166dKk5duxYntuSz40U\nPepI9syZM9x7771UrlyZqVOnWlpLcnIyn376KeXKlaNEiRIEBwezYcMG2rVrx9atW8nIyCAhIYE+\nffpozqqUD9myZQuxsbHs3r2b2rVrs2HDBmJiYvj444+zDhgLxWOmcBljqFq1KgBHjx61pIaYmBhe\ne+01Zs2alWN8zJgxjBo1iquuusqSupRS7hMeHk716tVp1aoVS5YsoWrVqlSvXp3bb7+9SK/nMU32\nscceA2w5bFBQkFve0xjDli1bGDVqFBs3brSPV6xYkXnz5tG9e3c9SlXKz0yePNmpr+cRccGqVav4\n7LPPCA0NLfJPC0clJyfz8ccfExQURIkSJWjevDkbN26kffv2bNu2jYyMDM6ePUvv3r21wSqlANuc\n9/379+dYqMlRlk/hypoPW6VKFWJjY13y3idPnmT69OnMnj07x/i4ceMYOXIk1apVc8n7KqX8g8fO\nk83IyCAgIACAxMREp8UExhg2b97MyJEj+eWXX+zjV155JXPnzqVbt256lKqUchqPXbsgaz7szp07\ni91gk5OTWbRoEUOHDiU5Odk+fs899/DGG29w++2365xVpZTbWdZks3LYF198kUaNGhXpNU6cOMH0\n6dOZM2dOjvHx48fz/PPPawyglLKcJXFBUXNYYwy//fYbI0eO5Ndff7WPV65cmXnz5tG1a1dKly7t\n9NqVUt7jwIEDXHXVVVSqVMlt7+lRmWxhc9iLFy/aY4BLly7Zxzt06MB//vMfGjVqpDGAUsquR48e\nfP3111x99dUEBwcTEhJCcHAwjRs35oorrnDJexYrkxWRTsAsIAD4wBjzeh7bzAbuA5KA/saY7Zd7\nvb59+wKwa9euyzbYEydOMG3aNN5+++0c4xMmTOD555+3X7SglPJ8xhjS09NJT08nLS0tx595jWX/\nMyUlhUtKS4V+AAAgAElEQVSXLnHp0qUcn+c3tnLlSowxnDhxgmXLlhEeHk5gYCBJSUnUrFmTli1b\nMnjwYO6++2637H++TVZEAoC3gXuAY8AWEVlujInMtk1n4EZjTD0RaQ7MA1rk9XqrVq1i4cKFvPzy\nyzRs2NA+boxh06ZNjBw5kk2bNtnHq1Spwty5c70mBoiIiCAkJMTqMlzK1/fR0f3Lahz5NQtHGkdh\nG0heY7mfS05OzjGWNZ6RkeH6f0APlPXvULZsWf78809SUlL417/+5RlNFggGoowxRwBEZBHwIBCZ\nbZsuwMcAxpjfRKSSiFQ3xsTkfrGOHTtStWpVJk2axMWLF1m4cCFDhgwhNTU1xzavv/66V8YA3t6A\nHGkcS5cupWbNmk5tHI5sn71xZG8e/to4iqJEiRIEBgaSkZFBxYoVCQwMpHTp0pQpU4bAwED7R+nS\npXM8vtyYo9uXLl2akiVLUrJkSQICAux/Zv88r7GAgIAi9YBnn32W2bNnU6FCBS5evEidOnW49957\nad++Pa1atXL7CfGCmmwNIPtCAtFAcwe2uQ74R5MF6N69+z/+4SZOnMhzzz3nkhggd+MozJFHYRvC\n2rVrOXv2rMNNJa/X9IbGERYWZnUJdgEBAQQGBlKqVKkc3+RlypQpUmP46aefeOCBBwpsLqVLly6w\nSeT1XFEbhzOFhoYSGhpqaQ2u1KxZM9q0acPUqVNp0aKF5culFtRkHT0rlvur5rJ/77333vvH2Kuv\nvsqrr77q4Ft5tuwXPxRVVuPI+gbP+jP7EYezjzbyaxzZm8Sbb77JxIkTPa5xOEtqaipPP/201WWo\nYujbty9RUVG0b9/e6lKAAmYXiEgLINQY0ynz8XggI/vJLxGZD0QYYxZlPt4HtM0dF4iIe6YxKKWU\nBYo6u2ArUE9EagHHgZ5A71zbLAdGAIsym/LZvPLYyxWglFK+LN8ma4xJE5ERwEpsU7g+NMZEisjg\nzOffNcasEJHOIhIFJAIDXF61Ukp5CbddjKCUUv7I6evJikgnEdknIgdFZOxltpmd+fxOEWns7Bpc\nraB9FJFHM/dtl4j8LCJFW5zBIo78H2Zu10xE0kSkuzvrcwYHv05DRGS7iOwWkQg3l1hsDnydVhWR\ncBHZkbmP/S0os8hEZIGIxIjIH/lsY32vudzNv4rygS1SiAJqAaWAHcDNubbpDKzI/Lw5sMmZNbj6\nw8F9bAlUzPy8kzftoyP7l227tcB3wENW1+2C/8NKwB7guszHVa2u2wX7GApMz9o/4AxQ0uraC7GP\nbYDGwB+Xed4jeo2zj2TtFy8YY1KBrIsXsstx8QJQSUSqO7kOVypwH40xvxpjEjIf/oZt3rC3cOT/\nEOBp4CvgtDuLcxJH9rEP8LUxJhrAGOOaFeVdx5F9PAFUyPy8AnDGGJPmxhqLxRizAYjPZxOP6DXO\nbrJ5XZhQw4FtvKkJObKP2T0BrHBpRc5V4P6JSA1s37DzMoe8Ldh35P+wHlBZRNaJyFYRecxt1TmH\nI/v4PnCriBwHdgLPuqk2d/GIXuPs9WSdfvGCB3K4VhFpBwwEWrmuHKdzZP9mAeOMMUZsVyF42/Q8\nR/axFNAEaA8EAb+KyCZjzEGXVuY8juzjBGCHMSZEROoCq0XkdmPMeRfX5k6W9xpnN9ljQM1sj2ti\n++mR3zbXZY55C0f2kcyTXe8DnYwx+f1K42kc2b87sc2LBluWd5+IpBpjlrunxGJzZB+PArHGmIvA\nRRFZD9wOeEuTdWQf7wJeBTDGHBKRP4H62ObH+wLP6DVODqJLAoewhe2lKfjEVwu86KRQIfbxemwn\nHVpYXa8r9i/X9h8B3a2u2wX/hw2ANdhOIAUBfwC3WF27k/fxLWBq5ufVsTXhylbXXsj9rIVjJ74s\n6zVOPZI1fnDxgiP7CEwBrgTmZR7tpRpjgq2quTAc3D+v5uDX6T4RCQd2ARnA+8aYvdZVXTgO/j9O\nAz4SkZ3Yzs+MMcbEWVZ0IYnIQqAtUFVEjgJTscU8HtVr9GIEpZRyIadfjKCUUur/aZNVSikX0iar\nPIqItBaRX0TkrIicEZGNItI087n+IrLBhe/9SOZ7J4rIOle9j/Ivzp7CpVSRiUgFbJfpDga+BAKx\nXTp5Kb+/50RnsJ1xvxn4l5veU/k4PZJVnuQmwBhjvjA2ycaY1caYP0TkZmxXmLUUkfMiEgcgIoEi\n8qaI/CUiJ0VknoiUyXwuRESiRWS8iJwWkT9FpM/l3twY86Mx5itsl5sq5RTaZJUn2Q+ki8h/M1eQ\nujLrCWO7Q/IQ4FdjTHljTOXMp14DbsR2ocCN2C6lnJLtNasDVYBrgceB90TkJtfvilI22mSVxzC2\nyzlbY7v08X3glIgsE5GrMjfJcYlk5iW9g4CRxpizxpgLwHSgV66XnmyMSTXGrAe+Bx5x5X4olZ1m\nssqjGGP2kTlpXETqA//DtlZCXr/mV8N2Ndbv8v83chRyHjzEG9ulsVn+wnZUq5Rb6JGs8ljGmP3Y\nlqq7LWso1yaxwEVsl7temflRyRhTIds2V4pIULbHN1Dw9et6hY5yGm2yymOISH0RGZm5lCIiUhPb\njTt/zdwkBrhORLIunczAFivMEpFqmX+nhoh0yPXSL4pIKRFpA/wbWHyZ9y+RedKsFFAi86RaKSfv\npvIz2mSVJzmPbQX730TkArbmugsYlfn8j9juVnBSRE5ljo3FthjPJhFJAFZjm6WQ5SS2hZ2PA58C\ng40xBy7z/v2AJGAutqljFwGvX6tBWUvXLlA+S0RCgE+NMTUL2lYpV9EjWaWUciFtssrX6a9qylIa\nFyillAu5bZ6siGg3V0r5LGNMnve6c2tcYPWtKlz9MXXqVMtr0H3U/dN9dP8+5kczWaWUciFtskop\n5ULaZJ0oJCTE6hJcztf30df3D3Qf3c1tswtExLjrvZRSyp1EBOMJJ76UUsrfaJNVSikX0iarlFIu\npE1WKaVcSJusUkq5kDZZpZRyIW2ySinlQtpklVLKhbTJKqWUCxXYZEVkgYjEiMgf+WwzW0QOishO\nEWns3BKVUsp7OXIk+xHQ6XJPikhn4EZjTD3gKWCek2pTSimvV2CTNcZswHa3z8vpAnycue1vQCUR\nqe6c8pRSyrs5I5OtARzN9jgauM4Jr6uUUl7PWbefyb36TJ7LbYWGhto/DwkJ8ajlyJRSylERERFE\nREQ4tK1DSx2KSC3gW2NMwzyemw9EGGMWZT7eB7Q1xsTk2k6XOlRK+SRXL3W4HOiX+UYtgLO5G6xS\nSvmrAuMCEVkItAWqishRYCpQCsAY864xZoWIdBaRKCARGODKgpVSypvonRGUUj4nPT2dL774gsOH\nD1OzZk02b97MqFGjqFOnjkveT++MoJTyKzt37uShhx6iTp06ZGRk0KNHD6655hpLanHW7AKlXMLd\nRyTKNzRp0gSAX3/9lZEjR1K7dm22bt1KYmIiv/32G2PGjHFbLXokqzyaJx2RKO+xZcsWYmNj2b17\nN7Vr12b9+vVs3bqV5s2bExsby4ULF9xWix7JKo/mSUckynuEh4dTvXp1WrVqxZIlS6hatSpDhgwh\nPT2dtLQ0ypUr57ZatMkqj7ZlyxZq166d44hk79699O/fn++//54LFy649RtGeYfJkyfnOf7FF18w\nYcIEUlNTKVWqlFtq0SarPJonHZEo7/bxxx+zfv161q1bx/z58932vjqFS3mlzz//nA4dOlCxYkW3\nHZEodTn5TeHSJqu8TtYRSYkSJZg/fz4BAQFWl6T8nDZZpZTXunDhAh07dmTBggXUr1/f6nLypBcj\nKI+xfPlyvv76a6vLUF5i7dq13HbbbWzZsoUaNWpYXU6R6Ikv5RZxcXEMGjSIb775hs2bN1tdjvJg\nly5dYtKkSezbt4/vvvsOgFq1anntSU5tssrlli1bRv/+/UlKSqJkyZI0atTI6pKUh9q6dSs9evQg\nJiaGixcv2sdbt25tYVXFo01WuUxcXBxPPvkkK1euJCkpCYAGDRoQGBhocWXKE23YsIH77ruPS5cu\nkZaWZh8vW7asVy/wr01WucTSpUsZMGAASUlJpKSk2Mfbtm1rYVXKk7Vp04aYmBhWrFjBkiVLCAoK\nYtu2bRw8eJDmzZtbXV6RaZNVTvfTTz8xZMgQkpKSchyRlCtXjrvvvtvCypSnK1u2LM2aNePGG2+k\ncePGAPz1119cd5333jZQZxcop2vbti3Hjx/no48+IiMjA4Dy5cuTkpLi1UckyvVOnjzJ3r177Q0W\n4IYbbvDqudDaZJVLpKWl8eijjwKQkpJCeHg4zz//vC5RqC7r/PnzNG3a1GtnEVyOXoygXKJx48bs\n2LGDo0ePevWveso9Lly4QLdu3bjqqqv47LPPrC6n0PK7GEEzWeV07733Hjt27OCzzz7TBqsKlJGR\nQfny5QFITEy0uBrn07hAOdXhw4cZPHgwbdu2pU+fPlaXo7xAVqy0a9cugoKCLK7G+TQuUE6TkpJi\nnwObmppKyZL6i5LK388//0zr1q155ZVXmDhxotXlFJnGBcotgoODAYiOjtYGqwoUGxtL9+7dWbBg\nAQMGDLC6HJfRuEA5xXvvvcfOnTv5/PPPvXYhD+VeU6ZMoVOnTj7dYEHjAuUEhw8fpm7durRt25aI\niAiry1FeIDk5mdWrV9OpUyefWHRd15NVLqM5rCqKpUuX0qVLF0qU8I1fpnU9WeUyTZs2BTSHVY4x\nxjBmzBjuuOMOn2mwBfGPvVQu8e677/LHH3+wcOFCzWGVQ1577TWWLl1K9erVrS7FbTQuUEWSlcO2\na9eOtWvXWl2O8gITJkxg+vTpREZG0qBBA6vLcapixQUi0klE9onIQREZm8fzVUUkXER2iMhuEenv\nhJqVB0tJSaFu3boArFq1yuJqlDcIDw9n+vTpTJs2zecabEHyPZIVkQBgP3APcAzYAvQ2xkRm2yYU\nCDTGjBeRqpnbVzfGpOV6LT2S9RENGzZk9+7dREdHa0ygChQbG0u1atW4+uqrOXHihNXluERxjmSD\ngShjzBFjTCqwCHgw1zYngAqZn1cAzuRusMp3zJ8/n927d2sOqxySkZFB165dAVvE5I8KOh1cAzia\n7XE0kHtB0PeBtSJyHCgPPOK88pQnOXToEEOHDqV9+/b06tXL6nKUF5g2bRpxcXGkpKT4xHzYoijo\nSNaR3+8nADuMMdcCdwDviEj5YlemPEpKSgo33ngjACtXrrS4GuUt9u3bxw8//OC3DRYKPpI9BtTM\n9rgmtqPZ7O4CXgUwxhwSkT+B+sDW3C8WGhpq/zwkJMSrb47mb5o0aQLAsWPHvHqVeuU+GzZsYObM\nmVSrVs3qUpwuIiLC4asbCzrxVRLbiaz2wHFgM/888fUWkGCMeVFEqgO/A42MMXG5XktPfHmpefPm\nMWzYMBYtWkTPnj2tLkd5gUOHDnH+/HnuuOMOq0txi2JdVisi9wGzgADgQ2PMdBEZDGCMeTdzRsFH\nwPXY4ofpxpjP83gdbbJeKCoqinr16tG+fXvWrFljdTnKC2zatInBgwezY8cORPLsOz5H1y5QRZJ9\nXYK0tDSNCVSBzp07R4MGDXjjjTfsi3H7A127QBVJ1h1DNYdVjjh9+jQVK1akRYsWftVgC6JNVuVp\n7ty57N27ly+//JJrr73W6nKUh8vIyOCqq64C8MobIbqSNln1D1FRUQwfPpx7772XHj16WF2O8gJP\nPfUUAHv27OGKK66wuBrPopmsyuHSpUuUKVMG0BxWOWbDhg106dKFpUuX0rZtW6vLsYRmssphmsOq\nwkhOTqZHjx7MmzfPbxtsQXSVZWX3zjvvEBkZqTmsctixY8d477336NKli9WleCyNCxQABw8e5Kab\nbqJDhw562axyyMWLF4mIiOC+++6zuhTL6TxZlS/NYVVhnTt3jk8++YRhw4b5zW1k8pNfk9W4QNkv\nfTx+/Lg2WFUgYwxdu3albt262mAdoE3Wz7399tvs27ePr776imuuucbqcpSHy8jIoE+fPhw7dozv\nv//e6nK8gsYFfiwrh+3YsSPh4eFWl6O8QPfu3VmyZAkHDhygXr16VpfjMTSTVf+gOawqrG+//ZYu\nXbrwxhtv8MILL1hdjkfRJqv+oX79+hw4cIATJ05w9dVXW12O8nCnTp2ievXq1K9fn3379lldjsfR\nixFUDnPmzOHAgQN8/fXX2mBVgTIyMujevTtPPPGENtgi0CNZP3PgwAHq169Pp06d+OGHH6wuR3mB\nXbt2MXToUH766SdKltRz5XnRuEABmsOqolm6dCldunTR6Vr50LhAAXDbbbcBcOLECW2wyiHr16+n\ndevW2mCLQf/l/MTs2bOJiorim2++0RxWOeTVV19lx44dVK1a1epSvJrGBX4gK4ft3LmzTiBXDvn5\n55/p3LkzW7du1fmwDtBM1o9pDqsKa9myZXTt2pXPP/+c3r17W12OV9Am68fq1atHVFSUzodVDomJ\nieHqq6+mdu3aHD582OpyvIae+PJTYWFhmsMqh6Wnp9u/Tvbu3WtxNb5Dm6yP2r9/P8899xz//ve/\n6datm9XlKC/w4osvUr58efbt22ePmFTxaVzgg5KTk+03s9McVjkiIiKC7t27s2vXLq677jqry/E6\nGhf4mVtvvRWAkydPaoNVDjl9+jSfffaZNlgX0GvkfExYWBiHDx9myZIlVK9e3epylBeIioqifv36\nNGrUyOpSfJLGBT5k//79NGjQgPvvv59vv/3W6nKUF4iOjmb37t106tTJ6lK8msYFfiA5OZkGDRoA\ntmvNlSpIQkICTZs2pVKlSlaX4tO0yfqIW265BdAcVjnm3LlzPPDAA9x///20aNHC6nJ8WoGZrIh0\nAmYBAcAHxpjX89gmBJgJlAJijTEhzi1T5WfmzJn8+eefLF26VHNYVaD09HQqVqwIwKpVqyyuxvfl\n22RFJAB4G7gHOAZsEZHlxpjIbNtUAt4BOhpjokVEV5Nwo3379jFy5EgeeOABHnzwQavLUV6gS5cu\nADof1k0KiguCgShjzBFjTCqwCMj9ndwH+NoYEw1gjIl1fpkqL8nJydx8880ALFmyxOJqlDdYu3Yt\nK1asYNasWdSvX9/qcvxCQU22BnA02+PozLHs6gGVRWSdiGwVkcecWaC6vKwGqzmscsTJkyfp2bMn\nCxcu5Nlnn7W6HL9RUCbryJyrUkAToD0QBPwqIpuMMQeLW5y6vLfeeosjR46wbNkyzWGVQyZNmsRD\nDz1Er169rC7FrxTUZI8BNbM9rontaDa7o9hOdl0ELorIeuB24B9NNjQ01P55SEgIISEhha9YERkZ\nyahRo+jSpYs9X1MqP4mJiXTr1o2OHTtaXYpPiIiIICIiwqFt870YQURKAvuxHaUeBzYDvXOd+GqA\n7eRYRyAQ+A3oaYzZm+u19GIEJ8i+LkF6erreFkQ5ZOnSpTz44IOI5DlfXhVTkS9GMMakASOAlcBe\n4AtjTKSIDBaRwZnb7APCgV3YGuz7uRuscp6sHDYmJkYbrCqQMYbnnnuOZs2aaYO1iF5W60VmzJjB\nCy+8wPLly3nggQesLkd5gcmTJ/PNN9+wbds2AgMDrS7HZ+mdEXxAZGQkt9xyCw8++KBeNqsc8swz\nzzBnzhwOHTpEnTp1rC7Hp2mT9XKaw6rC+uabb3jooYeYM2cOI0aMsLocn6dN1svdcMMN/P3338TE\nxHDVVVdZXY7ycCdOnODaa6+lfv367Nu3z+py/IKuwuXF3nzzTf7++2++/fZbbbCqQOnp6fa8fufO\nnRZXo0AX7fZokZGRjB49mm7dunH//fdbXY7yAlOmTCEtLU1vO+RB9EjWQyUnJ9uXL/zqq68srkZ5\niyNHjvDDDz9og/Ugmsl6qOuvv56jR49qDqscFhERQaNGjahcubLVpfgdzWS9zBtvvMHRo0c1h1UO\n279/P1WqVNEG64H0SNbD7N27l1tvvZXu3bvz9ddfW12O8gI//fQTzz77LNu3b9eruiyiU7i8xMWL\nFwkKCgJ0PqxyTFxcHDfffDNz587loYcesrocv6VxgZe46aabADh16pQ2WFWgEydOUKVKFTp06KAN\n1oPpd7KH+M9//kN0dDTfffcd1apVs7oc5eHS09O59tprAfjwww8trkblR5usB9izZw9jx47loYce\n4t///rfV5Sgv0KdPHwAOHjxI6dKlLa5G5UczWYtpDqsKa/Xq1fTq1YsVK1bQvHlzq8tRaCbr0W68\n8UZAc1jlmMTERHr37s2CBQu0wXoJvazWQq+//jrHjx/n+++/1xxWOeTYsWN8+umn3HfffVaXohyk\ncYFF9uzZw2233cbDDz/M4sWLrS5HeYELFy7w888/6326PJDOk/UwmsOqwjpz5gyff/45I0aM0AsO\nPJBmsh6mbt26gOawyjHGGLp06cL+/fv9vsHu3r2bV155hU2bNgHQv39/awtygH6Hu9lrr73GiRMn\nWLFiheawqkBpaWk8+OCDnDt3jrfeesvqciyXlJREqVKlMMYQGRnpFd9D2mTdaPfu3YwfP54ePXro\niQvlkI4dO/Ltt9+yfPlynQ8LBAcHs23bNlq2bMmmTZto1aqV1SUVSJusm1y8eJGGDRsCsGjRIour\nUd5g0aJFrF27lnnz5lG7dm2ry/EYWeczNm3aRMuWLS2upmDaZN0k626hp0+f1hxWFej48eP07t2b\npk2bMmTIEKvL8SjXX389ixcv5vfff6d69epWl1Mg/W53g+nTp3Py5El++OEHqlatanU5ysOlpaXR\ntWtXRowYwZYtW6wux6N88MEHhISEcPvtt/PII49YXY5DdAqXi+3evZuGDRvSs2dPjQmUQ37//Xde\neOEF1qxZo7eRyWXlypWkpKQQExPDwIEDPea3Qp0na5GkpCTKli0L6HxY5RhjDEuXLqVr165+P13L\nm+g8WYtknazQHFY5at26dbRr104brA/R73wXmTZtGqdOnSI8PFxzWOWQyZMns2/fPipVqmR1KcqJ\nNC5wgawctlevXixcuNDqcpQX+PHHH3n44YfZvn07tWrVsrocSxhjuHTpEmXKlLG6lEIrViYrIp2A\nWUAA8IEx5vXLbNcM+BV4xBjzTR7P+0WT1RxWFdbChQvp06cPS5YsoWvXrlaX4xLp6enMnTuXkydP\nEhMTw6lTp4iNjSU+Pp6EhATOnz9PUlISNWvW5MiRI1aXW2j5Ndl8lzoUkQDgbeAe4BiwRUSWG2Mi\n89judSAc8OswKesoRHNY5Yjo6Gj69OlDo0aNfLbBAgQEBHDixAlef/11MjIy/vF8YGAgt956K//7\n3/8sqM61CuoCwUCUMeaIMSYVWAQ8mMd2TwNfAaedXJ9Xefnllzl9+rTmsMohaWlp1KxZE8Dn58Me\nPnyYqKiofzTY0qVLU758eWbPns2OHTto1KiRRRW6TkFNtgZwNNvj6MwxOxGpga3xzssc8v1MIA+7\ndu1iypQp9O7dW9f7VA4ZP348lStX5tChQz63LkF6ejqrVq2iQYMGiAh169Zl8eLFXHfddfa5v0FB\nQXTr1o1Dhw7x1FNP+exvfgXtlSMNcxYwLjNwFfwwLkhKSuL2228H8Mlfd5TzrVy5kgULFrB37177\nJdfeLmulMBGhZMmSdOzYkf3799OrVy8OHjyIMYajR48yefJkatWqRXh4OIsWLfKKlbSKo6DbzxwD\namZ7XBPb0Wx2dwKLMuf1VQXuE5FUY8zy3C8WGhpq/zwkJISQkJDCV+yBbrjhBgBiY2N99qexcq74\n+HgWL17sFdfe5+fQoUNMnjz5H7No3nzzTQYNGkSFChX+8XcmTpzIhAkTKFWqlLvKdLqIiAgiIiIc\n29gYc9kPbE34EFALKA3sAG7OZ/uPgO6Xec74opdeeskAZuXKlVaXorxEZGSk2bNnj9VlFElaWpoJ\nDw839erVM9h+0zWAuemmm8zKlStNWlqa1SVaIrO/5dkX8z3sMsakASOAlcBe4AtjTKSIDBaRwYVq\n/T4oK4ft06cPHTp0sLoc5QWOHDnC0aNHueWWW6wuxWHnzp1jxowZ9higU6dOHDx4kD59+hAVFYUx\nhv3799OhQwddayEPejFCEel8WFVYsbGx3HzzzaxcuZImTZpYXU6+Dh06xKRJk/6xqNFbb73Fk08+\nSfny5S2qzDMVeZ6surysqTeawypHxMfHc//999O7d2+PbLDp6emsWbOGESNGEBUVZR9v0KABs2fP\n5l//+pcepRaRNtkieOmll4iLi2PVqlVUqVLF6nKUh0tLS6Ny5coAbNiwweJq/t+5c+d49913GTNm\nTI7xvn378uKLL/rMrAeraZMtpF27djF16lQeffRR7r33XqvLUV6gXbt2APz555+Wn1GPiopi4sSJ\nfPnllznGNQZwHc1kCyExMZFy5coBmsMqx/zwww907tyZDz74gCeeeMLt7591UcCIESM4fPiwffzm\nm28mLCxMYwAn0UzWSa6//npAc1jlmOjoaB599FGWLVtGly5d3Pa+CQkJvPvuu4wdOzbHeL9+/QgN\nDdWbMrqZNlkHhYaGag6rCmXixIn069fPLQ324MGDTJw4kcWLF+cYnzVrFgMHDtQYwEIaFzhg586d\n3HHHHfTt25dPP/3U6nKUFzh//jw///wzHTp0cMlvPWlpafYY4M8//7SP33LLLcyePZt27drpb1tu\npPf4KobsOWxGRobeFkQVyBjDkiVL6Natm1O/XhISEpg/fz7jxo3LMf74448TGhrqt4t9ewK9x1cx\nZM2HPXPmjDZYVaCMjAxGjBjBXXfd5ZSvlwMHDtCjRw9EhEqVKtkbbFhYGOfPn8cYw3//+19tsB5M\nM9l8TJ06lfj4eFavXm2f56hUfsaMGcMvv/xS5Nw+LS2NlStXMmLEiBx3CLjtttsICwsjJCREYwBv\nc7lFDZz9gZctELN9+3YDmMcee8zqUpSX6N+/vylRooT566+/CvX3zp49a6ZNm5ZjwRXA9O/f3/z5\n5zTGe6UAACAASURBVJ+uKVY5FfksEKOZbB40h1WF9cknn/D444+zYMECBgwYUOD2+/fvZ8KECXzz\nTc7b4c2ZM4f+/fvbv/6Ud9ATX4V05ZVXcvbsWc6cOaMxgSrQ33//zQ033EBwcDC//fZbntukpaUR\nHh7O8OHD+fvvv+3jDRs2JCwsjLZt22oM4MX0xFchTJ06lbNnz7JmzRptsKpAqampdO7cmSuuuIKN\nGzfmeO7s2bNMmzYNEaFUqVI88MAD/P333/Tv358jR45gjGHXrl063crH6YmvbLZv385LL71Ev379\naN++vdXlKC8wZswYgoKCuHDhAiVKlGDfvn2MHz+epUuX5thOYwD/pXFBJs1hVWFlZGTQt29fOnXq\nxKRJkzh69P/vOdqoUSPCwsK4++679SjVD2gm64CKFSty7tw5zWFVgeLj45k7dy6TJk3KMT5w4ECm\nTp1qX+NC+Q9dIKYAkydP5ty5c/z444/aYFWe9u3bx7hx41i2bFmO8XfeeYfHH3/cfpcMpXLz+yPZ\n7du306RJE/r3789HH31kdTnKQ6SlpbFixQqGDx9OdPT/36D5jjvuoHfv3ixcuJBt27ZprKQAjQsu\nS3NYlV18fDxvv/02U6ZMyTH+5JNPMmXKFGrWrElMTAy33nor//3vf7n//vstqlR5Go0L8mCM4Zpr\nrgF0XQJ/FhkZybhx41i+fHmO8blz59KvX78cMcBff/1FrVq1GDx4sDZY5TC/bbKTJ0/m/PnzrF27\nVnNYP5Kamsr333/P8OHDOX78uH28cePGzJo1i9atW+c5GyA1NdW+CMucOXPcVa7yAX45t2Tbtm28\n+uqrDBgwwH7/JeW74uPjeemllxARSpcuTbdu3Th+/DiDBg3i77//xhjDtm3b8p1u1bVrV8B2NGv1\nfbqUd/G7TPbChQv2VeI1h/Vde/bsYdy4cXz33Xc5xufPn89jjz1GUFCQw6/17bffMnDgQFatWkXj\nxo2dXaryAXriK5MxhvLly5OYmEhcXBxXXnmlpfUo50lNTeW7775j+PDhnDhxwj5+5513MnPmTFq1\nalWkiwLOnz9PrVq1+Pzzz+nYsaMzS1Y+RNcuyDR58mQSExNZu3atNlgfEBcXR2hoqD0G6N69OydO\nnOCpp57i6NGjGGPYunUrbdq0KfJVV0ePHuWLL77QBquKzG+OZLdt28add97JwIED+fDDDy2rQxWd\nMYY9e/YwduxYVqxYYR8XEebPn0/fvn0LFQMUJCEhgS1btnDPPfc47TWVb/L7uEBzWO+VmprK8uXL\nGT58ODExMfbxpk2bMnPmTO666y6XrA3wf+zdd1hTZ/sH8O8DMpxFwFHRFrUu1BRRQFARV6utVt9q\ntbX27bJVqV3u8f5aauuse9FhXXW2Vq2rriqKA0HFgYLirCgyVFBmQnL//gBOiYwESHKScH+uK5fk\n5Mk598m4fXKf5zwnKSkJmzZtwqeffsqfF6ZTpS4XEBHq1asHIO/nJX9hzN+DBw/w9ddfS2WAQYMG\nITExESNHjkR8fDyICJGRkSUOt6oojUaDV199Ff/88w9/XliF6fUJFUL0FkLECiHihBATi3n8bSHE\neSHEBSHEcSGEwvChls/UqVORmZmJw4cPcx3WTBERLl68iFdffRVCCLi6umLatGmwtbXFTz/9hIyM\nDBARQkJC4ObmZtRYVCoVXn75ZWg0GsycOdOo22KVREnXpSm4AbAFcA2AOwA7AOcAtHqqjR+AZ/L/\n7g0gvJj1lPv6OeV1+vRpAkAffvihybfNSqdUKmnLli1Ut25dreta+fj40LFjx0ij0cgSV4cOHQgA\n3blzR5btM8uEUq7xpU+S9QOwt9D9SQAmldK+NoD4YpabaHfzPHnyRPriyvWFZdpSUlLo//7v/4pc\nMHDUqFEUHx8vd3i0YsUKAkBr166VOxRmYUpLsvqcVusG4E6h+/EAfEtp/yGAPaU8bnREhLp16wLg\nOqyciAjR0dGYMGEC9u7dKy2vUqUKQkJC8Pbbb6Nq1aoyRvivf/75B8OHD0f37t3xzjvvyB0OsyL6\n1GT1HhIghOgG4AMAReq2pjRlyhRkZWUhNDSU67AmplQqsWXLFtSpUwc2NjZQKBTYu3cvfH19cfz4\ncWg0GqhUKgwfPtxsEqxKpcJrr72GcePG4e+//5Y7HGZl9OnJ3gXQqND9RsjrzWrJP9j1M4DeRPSo\nuBUFBwdLfwcGBiIwMLAMoern9OnTmDVrFoYPH46uXbsafP2sqAcPHmDBggWYPn261vKgoCBMnToV\nDRo0kCky/Zw9exb16tXD7Nmz5Q6FWYjQ0FCEhobq1VbnOFkhRBUAVwD0AHAPQASAt4goplCb5wAc\nAjCMiMJLWA/p2lZF8XhY06D8q6xOmDAB+/fvl5bb2dkhJCQEQ4cONZteqi5EhO3bt2PAgAH8eWHl\nVqH5ZIkoVwgxGsA+5I00+IWIYoQQI/If/xHAV8g74BWS/0FVEZGPoXZAH0SEOnXqAMibdYm/MIal\nVCqxfft2BAUF4cGDB9Lyjh07Yv78+ejYsaNFvuYHDx5Ez549LTJ2Zhn0mk+WiP4C8NdTy34s9Pdw\nAMMNG1rZTJkyBdnZ2Thy5AicnJzkDMVqpKSkYMGCBZgxY4bW8tGjR2PKlCnSpOeWavz48WjWrBl6\n9eoldyjMmpU07MDQNxhxCFdERAQBoI8//tho26gMNBoNRUVFUa9evbSGWDk4ONDKlSspMzNT7hAN\nZteuXeTs7GwWQ8eY5UMpQ7gsfu6CJ0+eoFatWgC4DlseSqUS27ZtQ1BQEB4+fCgt9/f3x7x58+Dr\n62t1r+mKFSvw0Ucf4a+//kLv3r3lDodZAaudIIaIULVqVeTk5ODRo0dcJtBTSkoK5s2bh1mzZmkt\n//TTTzF58mSLLwOU5ubNm2jSpAkCAgJw5MgRucNhVsJqL6Q4adIk5OTkcB1WByLCuXPnMGHCBBw8\neFBa7ujoiJCQELz55ptwdHSUMULTUCqVaNKkCQDweFhmMhY7C1dkZCTmzJmDESNGICAgQO5wzI5S\nqcSmTZtQu3Zt2NjYwMvLCwcPHkSnTp0QHh4OjUaDrKwsvPfee5UiwQLA2LFjUb9+fdy5cwdVqlh0\n/4JZEIssF3AdtnjJycmYN29ekUH1n3/+OSZNmoT69evLFJn8du7ciQ8//BAxMTFwcXGROxxmZayq\nXEBEcHV1BcDjYQvKAOPGjcOhQ4ek5dWqVcPy5csxZMiQStNL1eXx48fYunUrJ1hmchaXZCdMmACl\nUomjR49WyjpsTk4Otm7dipEjR+Lx48fS8s6dO2PevHnw9vau1P/xFOfSpUvo0KEDWrRoIXcorBKy\nqJpsREQE5s6dixEjRqBLly5yh2MySUlJmDBhAoQQcHR0xNChQ/H48WN88cUXSEhIABEhLCwMPj4+\nnGCfEhcXh8TERE6wTDYWU5OtTHVYIsLZs2cxfvx4HD58WFpevXp1hISE4I033uAygB7u37+P1q1b\nIzQ0FG3btpU7HGbFLL4mS0RSLS01NdUqE2xOTg62bNmCUaNG4cmTJ9LygIAAzJ07Fx06dLDK/TaW\nlJQU9OnTB8OHD+cEy2RlEUl2woQJUKlUCAsLwzPPPCN3OAaTlJSEOXPmYN68eVrLv/zyS0ycOFG6\nACQrG6VSKU0WFBkZKXM0rLIz+yR76tQpzJ07F0FBQejcubPc4VQIEeHMmTMYN26c1tlGNWrUQEhI\nCAYNGsRlAAPo0KEDACA+Pp7HwzLZmXVN1hrqsDk5Ofj9998xatQopKenS8u7du2KuXPnon379ha5\nX+Zq27ZteP3117Fx40a8+eabcofDKgmLnLuAiGBnZwe1Wo3U1FSLKhMkJiZizpw5mD9/vtbysWPH\nYvz48VwGMJKbN2+iXbt2+P3333n6QmZSFnnga/z48VCr1RZRhy0oA4wdOxZHjx6VltesWVMqAzg4\nOMgYYeUwZcoUjBo1ihMsqxC1Wo3Nmzfjxo0baNSoESIiIjB27Fhp3ouyMsue7KlTp9CxY0d88skn\nWLp0qZEjK5/s7GypDJCRkSEtDwwMxNy5c+Hl5cVlABN69OgRTp8+zVc5YBV29uxZtG7dGn/88Qdy\ncnLQuHFj+Pr6lnpJpdJ6smY3aXdaWpo0WbRGo9HrOaZy//59+uKLL7QmtAZA48ePp8TERLnDq7Q0\nGg398ccfZvd5YZZt9OjRdOPGDen+9u3b6e7du8W2RSmTdpvVGV9EJJ0qaw7jYYkIERER6NKlC4QQ\nqF+/PhYuXIhatWph/fr1yM7OBhFhzpw5qFu3rqyxPm369Olo06YNXnzxRbRr104ayrRw4UJkZWUZ\nZBuxsbHw8/ODo6NjkWFopqJWq/Hxxx8jICBA9s8Lsw6RkZFISUlBdHQ0GjdujLCwMCQmJmLNmjUF\nHcYyMaua7NixY0FEOHbsmGx12OzsbGzevBmjRo3SSkbdu3fH999/j3bt2pn9l/nkyZPYvXs3oqKi\nYGdnh4cPHyInJwcAsGjRIrzzzjsGuZqsi4sLlixZgu3bt1d4XeX12Wef4cKFC6hdu7ZsMTDrsnfv\nXtSrVw+dOnXCtm3b4Orqinr16uHFF18s3wpL6uIa+gYd5YKTJ08SAPrkk0/07MwbTkJCAn322WdF\nygATJ06kpKQkk8dTUVu3bqV+/foVWb5o0SKyt7entm3bUvfu3YmIaN++feTn50deXl70xhtvUHp6\nOhERPf/88zRhwgRq27Yt+fj40LVr10rcXnBwMM2dO9c4O1OKgQMHUpUqVejevXsm3zarfIKDg0u8\nJhxKKReYRZI1dR1Wo9FQeHg4derUSSupOjk50YYNGyg7O9voMRhTeno6eXp6UvPmzSkoKIiOHDki\nPebu7k4PHjwgIqLk5GQKCAiQLpA4a9YsmjZtmtRuxowZRES0du1a6tu3b4nbkyPJLl++nADQpk2b\nTLpdVjklJibSW2+9Rb/++muxj5t1ktVoNCSEIACUmppagZehdFlZWbR69WqqWrWqVmLt0aMHnT17\n1uoOmqjVagoNDaWvv/6a6tevT6tXryYi7SS7c+dOcnV1JU9PT/L09CQPDw8aPny41O7mzZtERKRU\nKsnFxaXEbZk6ycbFxUnvHWPmoLQkK3tNtqAOe/z4cYPXYe/fv4+ZM2di8eLFWssnTZqEMWPGSOe3\nWyMbGxt07doVXbt2Rdu2bbFmzRq8++67Rdr16tULGzZs0Lk+c6lDK5VK9OnTBy4uLti3b5/c4TCm\nk6yjC06ePIkFCxbg008/hb+/f4XXR0Q4deoUOnXqBCEEnn32WSxevBi1a9fGxo0bkZOTAyLCzJkz\nrTrBXr16FXFxcdL9qKgouLu7A8g7QaJgsm9fX18cP34c169fBwBkZGRoPW/z5s3Sv6W9P1SOI67l\n9dlnn6FevXpITk6Gra2tybbLWLmV1MU19A1PlQsMVYfNysqilStXkoODg1YZoFevXhQVFWV1ZQB9\nnDlzhvz9/cnDw4MUCgUNHDhQKhEsWbKEWrRoIR34OnToEHl7e5NCoSCFQkE7d+4korxywcSJE0mh\nUJCPjw9dv369yHYSEhKoYcOGVKtWLXJycqJGjRrRkydPjLZfarWahg0bJu0LY+YCpZQLZDnji4hg\nY5PXiS7PvAQJCQmYMWNGkbPBJk+ejDFjxkjXAGPl17hxY5w5cwbOzs5yhyLZv38/OnXqhOrVq8sd\nCmNazG7ugjFjxgCA3nVYyi8DfPnllwgPD5eWOzs7IyQkBAMGDIC9vb3R4q2MzKUGW+DcuXNwd3fn\nBMt0Gjt2LGJjY9G9e3f4+PjAy8tL3s9NSV1cQ9+QXy44ceIEAaDPP/+81O53ZmYm/fLLL2RnZ6dV\nBnjppZfo3LlzlbIMYE2uXr1KLVq0oKFDh9KPP/5IZ8+eJaVSWWzbbdu2Ufv27U0cIbNUgwYNIgBk\nb29PtWrVIjs7O3ruuedo8ODBtGzZMoqMjKScnByDbhMVKRcIIXoDWAjAFsAKIppdTJvFAPoAyATw\nHhFFFdOG0tLSpJ5rcfPD3rt3D9OnT8fy5cu1lk+dOhVffPGF2ZcBQkNDERgYKHcYRmWofbx16xZa\ntmyJnJwcVKtWDba2tsjOzkbTpk3RpUsXdO7cGd7e3qhRowY8PT2xefNm9OzZs+I7oIO5v4dEBLVa\nDbVajdzc3CJ/l7ZMqVQiJycHERERaNmypXS/uFtxj+lalp2drbWs4F+1Wi33y1bEZ599hkWLFhls\nfeUuFwghbAEsBdATwF0AkUKIHUQUU6jNKwBeIKJmQghfACEAOha3voIEm5aWVhAUTp48iTFjxuDU\nqVNSO1dXVyxfvhz9+/e3qDKAuX9BDUHffdRoNFpf8qf/TklJkerymZmZ0vNiY2MRGxuLDRs2QKPR\nICsrC87OztiwYQMuX74MPz8/VK9eXVpX4S+5vomhtMeuXLmCBg0aaCWO4rah0WiM9RJbHRsbGzg4\nOMDOzg4ODg7SzdHREfb29lrLHBwcil1W2mNPL1u8eDF27doFAHB0dESVKlWQm5sLLy8vvPLKKwgI\nCIC3t7fJ9l9XTdYHwDUiugUAQohNAPoDiCnU5jUAawCAiE4JIZyEEPWIKLG4FR4+fBi///47Ro4c\nidzcXGn5yy+/jNmzZ0OhUJhdPbAkBb2KgsSRnZ2NBw8eQK1WQ6VSFfkiFyxTqVTS8oK/lUolVCoV\nsrKykJmZKd2ysrKQnZ0t/VtcoihYh0qlgkql0kpqarUaGo0GarW6cOmmQr755hsDvHqlKzx95MOH\nD7Fq1Sqjb7PA7du3dbYpSBwFX/CCfx0dHfVKGPoml6eX2dvbo0qVKrC1tS3yr65lBd+r4OBgBAcH\nG/lVlM+BAwdw4MABdO/eHX369EFAQADatGkj25A/XUnWDcCdQvfjAfjq0aYhgGKTbLdu3aS/vby8\n0Lx5cxARsrOzMXHixCI/Nwonj8IJpCCJFCQQjUZjsCRSEbNnF6mmWBQhBGxsbGBjY1PkS1ulShVk\nZmbC1dUV9vb2Us/E3t5eSi5P/1vcsqpVq6JKlSoICgoqtkdYsG6VSoVWrVqhV69e6NKlC3x8fFCz\nZk2tBGLo/5CtPQFVBsHBwahatapJOgN6KalYm5+sBgL4udD9YQCWPNVmJ4BOhe4fBOBVzLqKTMDC\nN77xjW/Wcispj+rqyd4F0KjQ/UbI66mW1qZh/jItJRWFGWPMmuk6rfY0gGZCCHchhD2AIQB2PNVm\nB4D/AoAQoiOA1JLqsYwxVtmU2pMlolwhxGgA+5A3hOsXIooRQozIf/xHItojhHhFCHENQAaA940e\nNWOMWQiTnVbLGGOVkcFn4RJC9BZCxAoh4oQQE0toszj/8fNCiHaGjsHYdO2jEOLt/H27IIQ4LoRQ\nyBFneenzHua38xZC5AohXjdlfIag5+c0UAgRJYSIFkKEmjjECtPjc+oqhNgrhDiXv4/vyRBmuQkh\nVgohEoUQF0tpI3+uKW10QVlvyCspXAPgDsAOwDkArZ5q8wqAPfl/+wIIN2QMxr7puY9+AJ7J/7u3\nJe2jPvtXqN0hALsADJQ7biO8h04ALgFomH/fVe64jbCPwQBmFuwfgAcAqsgdexn2sQuAdgAulvC4\nWeQaQ/dkpZMXiEgFoODkhcK0Tl4A4CSEqGfgOIxJ5z4S0UkiSsu/ewp5Iy4shT7vIQB8CmALgGRT\nBmcg+uzjUAB/EFE8ABBRioljrCh99jEBQK38v2sBeEBEubAQRBQG4FEpTcwi1xg6yRZ3YoKbHm0s\nKQnps4+FfQhgj1EjMiyd+yeEcEPeFzYkf5GlFfb1eQ+bAXAWQhwWQpwWQrxjsugMQ599/BlAayHE\nPQDnAXxuothMxSxyjaGnOtT3y/b0mFlL+pLqHasQohuADwB0Ml44BqfP/i0EMImISOSdcmVpY6D1\n2Uc7AF4AegCoBuCkECKciOJKf5rZ0GcfpwA4R0SBQoimAA4IIV4koidGjs2UZM81hk6yBjt5wYzp\ns4/IP9j1M4DeRFTaTxpzo8/+tQewKf+UVlcAfYQQKiJ6egy1udJnH+8ASCGiLABZQoijAF4EYClJ\nVp999AcwHQCI6LoQ4iaAFsgbH28NzCPXGLgQXQXAdeQV2+2h+8BXR1jQQaEy7ONzyDvo0FHueI2x\nf0+1XwXgdbnjNsJ72BJ5p4jbIq8nexGAh9yxG3gf5wP4Ov/veshLws5yx17G/XSHfge+ZMs1Bu3J\nUiU4eUGffQTwFYDaAELye3sqIvKRK+ay0HP/LJqen9NYIcReABcAaJA3h8dl+aIuGz3fxxkAVgkh\nziPv+MwEInooW9BlJITYCKArAFchxB0AXyOvzGNWuYZPRmCMMSOS9ZLgjDFm7TjJMrMihOgshDgh\nhEgVQjwQQhwTQnTIf+w9IUSYEbc9VwhxVQjxWAgRY4HDtpgZkuVqtYwVRwhRC3lnkI0A8BsAB+Sd\n1ZNjohDSAfQloqtCCB8Ae4UQ14jopIm2z6wQ92SZOWmOvMmPN1OebCI6QEQXhRCtkHfyg58Q4okQ\n4iEACCEc8nugt4UQ94UQIUIIx/zHAoUQ8UKIyUKIZCHETSHE0JI2TkTBRHQ1/+8IAGHIO0WasXLj\nJMvMyRUAaiHE6vzJTWoXPEB5F+8cCeAkEdUkIuf8h2YBeAF5Y1hfQN5ZPl8VWmc9AC4AGgB4F8BP\nQojmugIRQlQF4A0guuK7xSozTrLMbFDemUadkXdWzs8AkoQQfwoh6uY30Tp7J/9ss48AjCGiVCJK\nBzATwJtPrfr/iEhFREcB7AYwWI9wfkDe2VD7y79HjHFNlpkZIopF/nhGIUQLAOuQdxpvcT/z6yDv\nRIEz4t8LKgpodx4eUd5ZWwVuI69XWyIhxPcAPAB0K60dY/rgniwzW0R0BXmzKLUpWPRUkxQAWcg7\nE6t2/s2JiGoValNbCFGt0P3nUcqplUKIbwC8DOCl/J4xYxXCSZaZDSFECyHEmPxZviCEaATgLQAF\nR/cTATQUQhSc1aNBXllhoRCiTv5z3IQQLz216m+EEHZCiC4AXgXwewnbn5y/vV5kWfNNMDPGSZaZ\nkyfIm1z5lBAiHXnJ9QKAsfmP/428ibTvCyGS8pdNRN48EeFCiDQAB5A3SqHAfeTNOXoPwK8ARhSM\nICjGdORNKHItfwTDEyHEJIPtHauU+LRaZrWEEIEAfiWiRrraMmYs3JNljDEj4iTLrB3/VGOy4nIB\nY4wZEfdkGWPMiEx2MoIQgrvMjDGrRUTFXuvOpD1ZuS9VYezb119/LXsMvI+8f7yPpt/H0nC5gDHG\njIiTLGOMGREnWQMKDAyUOwSjs/Z9tPb9A3gfTc1kQ7iEEGSqbTHGmCkJIUDmcOCLMcYqG06yjDFm\nRJxkGWPMiDjJMsaYEXGSZYwxI+IkyxhjRsRJljHGjIiTLGOMGZHOJCuEWCmESBRCXCylzWIhRJwQ\n4rwQop1hQ2SMMculT092FYDeJT0ohHgFwAtE1AzAxwBCDBQbY4xZPJ1JlojCkHe1z5K8BmBNfttT\nAJyEEPUMEx5jjFk2Q9Rk3QDcKXQ/HkBDA6yXMcYsnqEOfD09MQLPBMMYYzDM5WfuAih8XfuG+cuK\nCA4Olv4ODAw0q+nIGGNMX6GhoQgNDdWrrV5THQoh3AHsJKK2xTz2CoDRRPSKEKIjgIVE1LGYdjzV\nIWPMKpU21aHOnqwQYiOArgBchRB3AHwNwA4AiOhHItojhHhFCHENQAaA9w0XOmOMWTaetJsxZnXU\najU2b96MGzduoFGjRoiIiMDYsWPRpEkTo2yPJ+1mjFUq58+fx8CBA9GkSRNoNBq88cYbePbZZ2WJ\nxRAHvhgzGlP3SJh18PLyAgCcPHkSY8aMQePGjXH69GlkZGTg1KlTmDBhgsli4Z4sM2vm1CNhliMy\nMhIpKSmIjo5G48aNcfToUZw+fRq+vr5ISUlBenq6yWLhniwza+bUI2GWY+/evahXrx46deqEbdu2\nwdXVFSNHjoRarUZubi5q1Khhslg4yTKzFhkZicaNG2v1SC5fvoz33nsPu3fvRnp6ukm/MMwy/N//\n/V+xyzdv3owpU6ZApVLBzs7OJLFwkmVmzZx6JMyyrVmzBkePHsXhw4fxww8/mGy7PISLWaQNGzbg\npZdewjPPPGOyHgljJSltCBcnWWZxCnokNjY2+OGHH2Brayt3SKyS4yTLGLNoq1atQr9+/eDq6ip3\nKMXikxGY2cjIyMCFCxfkDoNZiJycHEyZMgWffPIJsrKy5A6nXDjJMpM5evQoPDw88M8//8gdCjNz\nsbGxOHDgANq3b4+ZM2fC3t4eDRta5jTVPLqAGV1GRga+/PJLrFu3DllZWfD19ZU7JGam1Go15syZ\ng2+//RY5OTnQaDQA8sZLC1Hsr3Gzx0mWGdWRI0fw5ptvIjU1FdnZ2ahTpw7q1Kkjd1jMDMXGxmLI\nkCG4dOkS1Gq1tNzOzg49evSQMbKK4XIBM4r09HR89NFH6NOnD+7fv4/s7GwAgI+Pj8yRMXPl4uKC\noKAgeHl5wdXVFS4uLgCAqlWrws/PT+boyo+TLDO4kydPolWrVli5cqXWwQoHBweL7pEw46pTpw5G\njBiB48ePIyQkBMnJyYiMjMSbb76JDh06yB1eufEQLmZwOTk5OHDgAFatWoWtW7dKy2vUqIH9+/db\ndK+EGd+OHTvQp08fizrJhIdwMZNycHBA3759kZGRASBvjOOgQYNgZ2eHdu3ayRwdM2fDhw9H1apV\nLSrB6sI9WWYUf/zxBwYNGoQlS5Zg9OjRAIDc3FxUqcLHWlnxli9fjpkzZyI6OhrPPPOM3OGUCZ/x\nxUwqISEBDRo0QIsWLRAbGyt3OMwCTJgwAd9//z3Onj1rkb92OMkyk1Gr1VJvNTs7Gw4ODjJHxMzd\niRMn0KlTJ3z22WdYtGiR3OGUCydZZjIvv/wy9u/fj6tXr6JZs2Zyh8PM3OPHj6XSgEajsdgTlZGr\nLgAAIABJREFUDvjAFzOJ33//Hfv378fSpUs5wTKdiAhvv/023NzckJaWZrEJVhfuyTKDKKjDtmzZ\nEjExMXKHwyzA0qVLMX/+fFy+fBmOjo5yh1Mh3JNlRqVWq9GgQQMAwLlz52SOhlkKpVKJXbt2WXyC\n1YXH07AK69OnDwAgLi6OD3QxvZw6dQpDhgyBm5ub3KEYHfdkWYX89ttvOHDgAJYtW4YXXnhB7nCY\nBbh06RKEEJUiwQJck2UVcO/ePbi5uaFVq1a4fPmy3OEwC3Dp0iV06dIFcXFx0gQw1oBrsszg1Gq1\n1BPhOizTR1JSEvr164dvv/3WqhKsLpxkWbn07t0bQF4d1t7eXuZomLlLS0tDvXr1AABBQUEyR2Na\nOpOsEKK3ECJWCBEnhJhYzOOuQoi9QohzQohoIcR7RomUmY3ffvsNBw8exPLly7kOy3QiIjg5OQHI\n+9VjreNhS1JqkhVC2AJYCqA3AA8AbwkhWj3VbDSAKCLyBBAIYJ4QgkctWKl79+5hyJAhaN26NUaN\nGiV3OMwCzJ8/H0DePMO1atWSORrT09WT9QFwjYhuEZEKwCYA/Z9qkwCg4JWrBeABEeUaNkxmDnJz\nc6U67NmzZ2WOhlmCM2fOYNq0aTh37hw6duwodziy0NXjdANwp9D9eABPXwXvZwCHhBD3ANQEMNhw\n4TFzUlCHvXbtGtdhmV6CgoIwa9YsvPjii3KHIhtdSVafMVdTAJwjokAhRFMAB4QQLxLRk6cbBgcH\nS38HBgYiMDCwDKEyOW3evBl///03QkJC0LRpU7nDYRbgzp07mDt3Lrp06SJ3KAYXGhqK0NBQvdqW\nOk5WCNERQDAR9c6/PxmAhohmF2qzB8B0Ijqef/9vABOJ6PRT6+JxshaqYDxsmzZtcPHiRbnDYRZA\npVJh79696Nevn9yhmERFxsmeBtBMCOEuhLAHMATAjqfaxALomb+hegBaALhRsZCZuShchz1z5ozM\n0TBLkJWVhc8//1wqL1V2pZYLiChXCDEawD4AtgB+IaIYIcSI/Md/BDADwCohxHnkJe0JRPTQyHEz\nE3nppZcAcB2W6e+tt96CjY0NX2ooH59Wy0q0ceNGDB06FD/88ANGjBghdzjMzBEROnfujJs3b+LK\nlSuoWbOm3CGZDF8ZgZXZ3bt30bBhQ7Rt2xYXLlyQOxxmAYKCghASEoKIiAh4e3vLHY5JcZJlZZKb\nmytdkjknJ4fLBEynY8eOoUuXLhg/fjzmzJkjdzgmx0mWlUn37t1x+PBhXL9+HU2aNJE7HGbmUlNT\n4ebmhsaNG+PixYuV7rRZgGfhYmWwceNGHD58GD/++CMnWKYTEWHo0KF49dVXER0dXSkTrC7ck2WS\n+Ph4NGrUCAqFAufPn5c7HGYBHj9+jA8++ADr16+v1FfF4HIB04nrsKw8duzYgVdeeaXSD9ficgHT\nqWfPngCAGzducIJlejlx4gQ6dOhQ6ROsLpxkGTZs2IAjR47gp59+QuPGjeUOh1mAhQsXYuHChdJV\nilnJuFxQyRXUYT09PREVFSV3OMwCnD9/HgEBAQgLC4NCoZA7HLPANVlWLK7DsrI6evQounbtipCQ\nEIwcOVLucMwGJ1lWrILeyI0bN7hMwHRKTU1F7dq14ejoiMzMTB6uVQgf+GJFrF+/HmFhYfj55585\nwTKdiEi6EGJycjIn2DLgJFsJxcfHY9iwYWjXrh2GDx8udzjMAixYsABubm64du0aatSoIXc4FoXL\nBZVM4TqsUqmU/masJFeuXIGvry8iIiLQvHlzucMxS1wuYJJu3boByBsPywmW6ePBgwfYs2cPJ9hy\n4lHElci6detw7NgxrsMyvf3zzz+wt7dHhw4d5A7FYnG5oJK4c+cOnnvuOXh5efFlZJheLl++jKio\nKLz99ttyh2L2uFxQyeXm5uK5554DAISHh8scDbMEGRkZ6N27N5RKpdyhWDxOspVAQR325s2bXIdl\nOj169AidO3eGj48P3nvvPbnDsXhck7VyBXXYFStWwN3dXe5wmJkjIjg7OwMAwsLCeDysAXBP1ord\nuXMH77zzDjp06IAPP/xQ7nCYBSgYN3369GkeD2sgfODLSvF4WFZWERER8PX1xZQpUzB9+nS5w7Eo\npR344nKBleratSsArsMy/Tx69AgDBgzAihUr+FePgXG5wAqtXbsWJ06cwMqVK7kOy/Ty559/okeP\nHpxgjYDLBVbmn3/+wfPPPw9vb29ERETIHQ6zAEqlEvv370ffvn3lDsVi8VSHlQTXYVl5/Pnnn+jb\nty9sbW3lDsVi8ckIlUSXLl0AALdu3eIEy/TyzjvvwMnJiROsEXGStRJr1qxBeHg4Vq1aheeff17u\ncJgFmDt3Lo4dO4b27dvLHYpV43KBFSiow/r6+vJps0wvQUFBCAkJwcWLF9GmTRu5w7F4FSoXCCF6\nCyFihRBxQoiJJbQJFEJECSGihRChFYyXlYFKpZJ6rmFhYTJHwyzBoUOHEBISgqlTp3KCNYFSe7JC\nCFsAVwD0BHAXQCSAt4goplAbJwDHAbxMRPFCCFciSilmXdyTNQI/Pz+Eh4fj1q1bXCZgOj18+BAu\nLi6oWbMm0tLS+LRZA6lIT9YHwDUiukVEKgCbAPR/qs1QAH8QUTwAFJdgmXGsXr0a4eHhWL16NSdY\nphMRYciQIWjatCkSEhI4wZqIriTrBuBOofvx+csKawbAWQhxWAhxWgjxjiEDZMW7ffs23n//ffj6\n+uLdd9+VOxxmAebOnYvbt2/j8uXLqF69utzhVBq6TqvV5/e9HQAvAD0AVANwUggRTkRxTzcMDg6W\n/g4MDERgYKDegbJ/qVQq6UwursMyfdnY2GDPnj2wt7eXOxSLFxoaitDQUL3a6qrJdgQQTES98+9P\nBqAhotmF2kwEUJWIgvPvrwCwl4i2PLUurskaSMFF7W7fvi1Nxs1YaU6cOIEmTZqgfv36codilSpS\nkz0NoJkQwl0IYQ9gCIAdT7X5E0BnIYStEKIaAF8AlysaNCve6tWrERERgdWrV3OCZXo5d+4cHBwc\nOMHKROc4WSFEHwALAdgC+IWIZgohRgAAEf2Y32YcgPcBaAD8TESLi1kP92Qr6Pbt23B3d4efnx9O\nnDghdzjMAkRFRaFHjx64ceMGnJyc5A7HavHcBVZApVJJtTSel4Dp4+7du+jYsSOmTZuG999/X+5w\nrBrPXWAFOnXqBCCvN8sJluny8OFDNGzYEM7OzpxgZcZJ1gKsXLkSkZGRWLt2LddhmU5EBBcXFwDg\nspIZ4CRr5m7duoUPP/wQ/v7+eOcdHoLMdPv2228B5NVjeTys/Lgma8YK12FVKhWqVOGrBbHSnTx5\nEn369EF4eDhatmwpdziVBtdkLVRBHfaff/7hBMv0Mnr0aCxevJgTrBnhb66ZKlyHbdSokdzhMAtw\n69YtLFu2DB07dpQ7FFYIlwvM0K1bt9C4cWN06tQJx44dkzscZgFycnJw8OBBvPrqq3KHUinxOFkL\nwnVYVlbp6ekYN24cli5dyp8XmXBN1oL4+fkB4Dos0w8RYdCgQXj8+DF/XswUvytm5JdffsGZM2fw\n66+/ch2W6aTRaODp6Ym0tDTExMTofgKTBZcLzMTNmzfRpEkTdO7cmacvZHoZNmwY1q9fj/Pnz0Oh\nUMgdTqXGNVkzp1Qq4eDgAIDrsEw/+/fvx8svv4xvvvkGX331ldzhVHqcZM2cl5cXoqKicOfOHTRs\n2FDucJiZe/DgAZ599lm0b98eJ0+elDscBj7wZdZWrFiBqKgorFu3jhMs00mj0WDw4MEYMmQIJ1gL\nwT1ZGRXUYQMCAnDkyBG5w2EW4OHDhwgKCsKvv/7Ks7GZES4XmCGuw7Ly2L59O/r16wdbW1u5Q2GF\nlJZk+ZstE19fXwDAnTt3OMEynYgIYWFh8Pf35wRrYbgmK4OffvoJ586dw/r167kOy/Qye/Zs/PDD\nD6hbt67cocgqOjoa3333HcLDwwEA7733nrwB6YG7UCZ248YNjBgxAl27dsXQoUPlDodZgMjISMyc\nOROnTp2SOxTZZWZmws7ODkSEmJgY1KlTR+6QdOKerAkplUo0bdoUAHDw4EGZo2GWYN++ffDx8cGS\nJUt4+kIAPj4+OHv2LPz8/BAeHi5NB2rOOMmakI+PDwAgPj6e67BMp5SUFPTu3Rt16tTBf//7X7nD\nMRvVqlUDAISHh0tzfZgzTrIm8tNPP+H8+fPYsGED3Nzc5A6HmTmNRiP9FL5165a8wZiZ5557Dr//\n/jvOnDmDevXqyR2OTpxkTaCgDhsYGIi33npL7nCYBZg5cyaaN2+O27dvSz03lnfyTmBgIF588UUM\nHjxY7nD0wuNkjYzHw7Kyunz5Mvz9/XHu3Dm4u7vLHY5Z2bdvH5RKJRITE/HBBx/AxsY8+ol8MoKM\nFAoFLl68iPj4eC4TML2EhYXB0dER3t7ecofC9MQnI8jkxx9/xMWLF7Fx40ZOsEwvN2/eRI0aNdCu\nXTu5Q2EGwj1ZI7lx4waaNm2Kbt264dChQ3KHwyzAhQsXcOnSJa7bWyCehcvECo+H3b9/v8zRMEvw\n5MkT9O7dW+4wmBHoLBcIIXoDWAjAFsAKIppdQjtvACcBDCairQaN0sJ06NABAI+HZfpJSUlBQEAA\nevToYbW9WCJCZmYmHj58iEePHkm3gvspKSlITEyEk5MT5s+fL3e4BlVqBhBC2AJYCqAngLsAIoUQ\nO4gopph2swHsBVBsl7my+OGHH3Dx4kVs2rSJ67BMp8LjYc+cOSNzNMaj0WjQq1cvREREoHr16gU/\nr6FWq6FUKqFSqSCEQFBQkNyhGpyucoEPgGtEdIuIVAA2AehfTLtPAWwBkGzg+CzK9evXMWrUKPTo\n0QNDhgyROxxmAQp6rtHR0ahatarM0RiPra0tli1bBrVajcePHyMtLQ2PHz9GRkYG7O3t0bp1a5w5\ncwZLly6VO1SD05Vk3QDcKXQ/Pn+ZRAjhhrzEG5K/qPIc3SpEqVTihRdeAJA3lo8xXY4dO4bffvsN\nM2fOROvWreUOxyhu3LiBt99+G0IIeHl5aT1mZ2eHGjVqYM6cObhw4YLVjqjQlWT1SZgLAUzKHzog\nUEnLBQUfoLt37/J8n0yn5ORkvP7661i/fj0mTZokdzgGo1arsX//frRo0QJCCDRt2hQbNmxAs2bN\nsG/fPqhUKvj4+KBKlSro378/rl+/jqCgINy6dQshISFWWTLRdVTmLoBGhe43Ql5vtrD2ADYJIQDA\nFUAfIYSKiHY8vbLg4GDp78DAQAQGBpY9YjMUEhKCS5cuYdOmTWjQoIHc4TALsH37dvTv398qprt8\n/Pgxfv75Z4wbN05r+dChQzFt2jRppE2BzZs3IyYmBhqNBlOnTsXu3buRkJCAESNGYOTIkaYMvdxC\nQ0MRGhqqX2MiKvGGvCR8HYA7AHsA5wC0KqX9KgCvl/AYWaO4uDgCQD179pQ7FGYhMjMzac+ePXKH\nUSHXrl2jN998k5D3a1e6zZs3jx4/flykvUajoQsXLtCsWbOoQ4cOZG9vT7Vq1SIhBFWpUoW6d+9O\nKpVKhj0xjPz8VnxeLOkB+jc59gFwBcA1AJPzl40AMKKYtpUqyebk5EgfrtzcXLnDYRZi27ZtpFar\n5Q6jTHJzc2nv3r30wgsvaCXVFi1a0P79+4v9/D948IA2bdpEQ4YMIScnJ6pevTo5ODhoPb9KlSrk\n4eFB6enpMuyV4VQoyRrqZo1J1sPDgwDQ3bt35Q6FWQCNRkNvvPEGHTt2TO5Q9JKWlkZz5swp0lt9\n++236fr16yU+79GjR9SjRw+ysbGhmjVrFnl+wU0IQfXr16fExEQT7pVxcJI1gmXLlhEA+u233+QO\nhVmIb7/9lpo3b06ZmZlyh1KiuLg4Gjx4cJGEOH/+/GLLACW5cuUKNWnShBwdHUtMsrVq1aIrV64Y\ncW9Mh5OsgRXUYXv16iV3KMxCDBs2jACYXVLJzc2lPXv2UNOmTbUSYMuWLUssA+grIyODnnvuuWIT\nbLVq1ej48eMG3BN5cZI1oOzsbK7DsjLZtWsXAaA5c+bIHQoREaWmphZbBhg2bBjduHHDINs4c+aM\ntF5nZ2eqVq2adL9q1ar0xx9/GGQ75oKTrAG1atWKANC9e/fkDoVZgKSkJAJADRs2lDWOq1evFlsG\nWLhwYZnKALokJydLxyoA0KlTp4iI6MKFC+Tm5kZ2dnY0b948g23PXHCSNZClS5cSAPr999/lDoVZ\nALVaTV26dKE2bdqYvA5bUAZo0qSJVlJt1aoVHTx40OCjG5RKJY0bN07azuLFi0mj0Wi1SUtLozVr\n1hh0u+aCk6wBXL16lQDQSy+9JHcozEJMmzaNWrdubbLxn6mpqTRr1qwivdV3333XYGWA4uzevVva\n1quvvkpPnjzR+ZzvvvuOWrduTQqFgjw9PSkiIoKIiBYsWGCw/5DWrVtHCoWC2rZtS/7+/nT+/HmD\nrLc4nGQriOuwrDy+//57un37tlG3ceXKFRo0aFCRxLpo0SKDlgGKc+PGDapSpYq0zWvXrun1vBMn\nTpCfnx8plUoiyhtPW1B+c3d3p5SUFIPEd+LECUpNTSUior/++ot8fX0Nst7icJKtoJYtW3IdlpXJ\nkSNHKDk52eDrValUtGvXLnJ3d9dKqh4eHvT333+b5CSH9PR06t+/v7TtHTt2lOn5W7dupX79+hVZ\nvmjRIrK3t6e2bdtS9+7diYho37595OfnR15eXvTGG29IJy08//zzNGHCBGrbti35+PjoTPAPHz4k\nNze3MsVZFpxkK2DJkiUEgLZs2SJ3KMxCRERE0Llz5wy2vtTUVJo5c2axZYCbN28abDu6aDQaaXw4\nABozZozUGy2L9PR08vT0pObNm1NQUBAdOXJEeszd3Z0ePHhARHkH0QICAqTywaxZs2jatGlSuxkz\nZhAR0dq1a6lv376lbvP777+njz76qMyx6ouTbDkV1GF79+4tdyjMQpw4cYKcnZ0pLS2tQuuJjY2l\ngQMHFkmsixcv1qvmaWinT5/WOpW2omdpqdVqCg0Npa+//prq169Pq1evJiLtJLtz505ydXUlT09P\n8vT0JA8PDxo+fLjUruA/GKVSSS4uLiVu69ChQ9SqVSt6+PBhhWIuDSfZcuA6LCurmzdvUv369Wn9\n+vVlfq5KpaKdO3fS888/r5VU27ZtS4cOHZJtroOkpCRq0aKFFE/BASpD2rJli1Q+eDrJvvXWW8U+\n5+kk6+rqWmy78+fPU9OmTSkuLs7gcRdWWpLlCymWQKFQAAASEhJ4flimU1JSEho3bowmTZroPX1h\namoqZs6cCSEE7Ozs0K9fP9y+fRvvvfcebt26BSLChQsX0K1bN9jYmParqlKpMHbsWNStWxdXrlzB\n0qVLodFo4O3tXeF1X716FXFxcdL9qKgouLu7AwBq1qyJx48fAwB8fX1x/PhxXL9+HQCQkZGh9bzN\nmzdL//r7+xfZzj///IPXX38d69atkybUl0VJ2dfQN1hQT3bx4sUEwOrOSmHGoVarpZ5eVlZWqW1j\nYmLoP//5T5EywJIlS2QpAxRn586dUlyvvfaaweM6c+YM+fv7k4eHBykUCho4cKDUe12yZAm1aNFC\nOvB16NAh8vb2JoVCQQqFgnbu3ElEeT3ZiRMnkkKhIB8fn2InrBk+fDg5OztL5QZvb2+D7kdh4HKB\n/q5cucJ1WFYmEyZMIAB0+fLlIo+pVCrasWNHkXP427ZtS4cPHzarKQ+vX78uxWdjY1PqTFtyK1xW\nMAecZPXEdVhWVqGhoVS7dm2twf6PHj2i7777rkhv9YMPPjD6uNnyePLkCfXt21eKs6C3aM4aN27M\nSbbIhiwgyTZr1owAUEJCgtyhMAug0WhIoVDQ5s2bKSYmhgYMGFAksS5btsxsJ6TWaDTSEEUANG7c\nuHINyWKlJ1ld1/iqNBYvXoy4uDhs3boV9evXlzscZuZyc3Pxyy+/4P79+1qXf1coFFi0aBECAgJM\nfrCqLCIjI+Hj4wMAaNmyJY4ePYo6derIHJWVKin7GvoGM+7JFtRhX3nlFblDYWbs4cOH9O233xbp\nrX744YdmWQYoTmJiovSLDQCdPn1a7pCsAkrpyYq8x41PCEGm2lZZ5OTkwNHREUBe74SHa7HCYmJi\nMHnyZPz5559ayzt16oQ9e/agVq1aMkVWNiqVCuPHj8eiRYsA5F1hecSIEci/yjSrICEEiKjYF9N8\nf8+YSJs2bQDweFiWJzc3F3/++ScaNmwIIQQ8PDzw559/wtPTE0eOHEFubi66du2K5s2bW0yC/fPP\nP2Fvb49FixZhwIABSE9Px8iRIznBmkilrskuWrQI165dw7Zt27gOW4k9evQIS5cuxVdffaW1fPjw\n4fjqq6/QqFEjAIBarUbz5s0hhMDevXvlCLVMrl27hmbNmgEA7O3tERsbi8aNG8scVSVUUh3B0DeY\nWU02NjaWAOicWIJZp0uXLlG/fv2K1FdDQkJKHA1Q0D4mJsbE0ZbNkydPqE+fPtI+7d69W+6QrB54\nCJe2rKwsHg9bySiVStq2bRs1aNBAK6l6eXnR0aNHdZ4UsG3bNgLyrtpqrjQaDS1atEjatwkTJphs\nwvDKjpPsUwouyXH//n25Q2FG9PDhQ/rmm2+K9FY//vhjunPnjt7ruX//PtnY2FDPnj2NGG3FhIeH\nS/vXpk0bo8xly0rGSbaQhQsXEgDatm2b3KEwI4iOjtY6ewkACSHoxx9/pIyMjDKvLzc3l/z9/Y06\nF2lF3L9/X+s6XmfPnpU7pEqJk2w+rsNaH6VSSVu3bqX69etrJdb27dtTWFhYhecGSEpKomHDhpnd\nz+6cnBwaPXq0tL8//vhjkQsXMtPhJEtch7UmDx48oK+//rpIGWDEiBFlKgPoY9u2bWY1iQvRv/Vh\nADRw4MBy9dCZYZWWZCvNEC4PDw8AwP3793k8rIUhIly6dAkTJ07Enj17pOU2NjYICQnBsGHDUK1a\nNYNvMzQ0FF26dDGb02Pj4uLQvHlzAICjoyNiYmKkeViZ+TKPT4+RLViwADdv3sT27dtRr149ucNh\nelCpVPjjjz9Qv3592NjYoG3bttizZw86dOiAsLAwaDQaqNVqfPzxxwZPsAAQHByMVatWwcXFxeDr\nLqsnT57g5ZdflhLsX3/9haysLE6wlqKkLi5p/9TvDSAWQByAicU8/jaA8wAuADgOQFFMG1P13LXE\nxMQQgGKvjsnMS0pKCn311VdFygAjR46k+Ph4k8Vx9OhReuaZZ/S+xLWxqNVqWrBggfQ6TJkyxexq\nwywPKlKTBWAL4BoAdwB2AM4BaPVUGz8Az9C/CTm8mPWYcJfzcB3WvGk0Grpw4QK98sorWknV1taW\nfv75Z1lqjVu3biUAtGnTJpNvu7CTJ09Kr4dCoaCUlBRZ42Glq2iS9QOwt9D9SQAmldK+NoD4Ypab\naHf/VXBteh4Paz6USiVt2bKF6tatq5VYfXx86Pjx47IeIU9ISCAA1LRpU1ljKPjcAqCoqCjZYmH6\nKy3J6lOTdQNwp9D9+PxlJfkQwJ5SHjeJ+fPn49atW9ixYwfXYWX24MEDfPXVVxBCwN7eHoMGDUJS\nUhKCgoIQHx8PIsKpU6fg7+8v26QlarUazz77LAAgOjra5NtXKpX45JNP8Oyzz+LWrVtYsWIFNBoN\nPD09TR4LM7CSsi/92wMdCODnQveHAVhSQttuAC4DqF3MYyb6P+XfOmz//v1Ntk32r4IyQO/evbV6\nq3Z2drRixQrKzMyUO8Qipk6dSh4eHnT37l2Tb3vLli3SazR48GAekmWBUMEhXHcBNCp0vxHyerNa\nhBAKAD8D6E1Ej4pbUXBwsPR3YGAgAgMD9dh82WRnZ6NVq1YAgK1btxp8/ax4SqUSO3bswKhRo5CS\nkiIt9/X1xYIFC9CxY0eznVrv/PnzWL58OaKjo9GgQQOTbffq1ato0aIFAKB69eq4dOkSnn/+eZNt\nn5VfaGgoQkND9WtcUvalf3ugVQBcR96BL3sUf+DrOeQdHOtYynpM8j9KQT0rMTHRJNurzFJSUmjq\n1KlFRgN88sknsvQIy+vQoUN0/vx5k20vLS2NevbsKb1e+/btM9m2mXGgomd8AegD4Ep+Ip2cv2wE\ngBH5f68A8ABAVP4toph1GH1H586dSwBox44dRt9WZaTRaOjcuXP00ksvaSVVe3t7+uWXX8yyDKBL\nXFwcXbhwwSTbUqvV0mcUAP3vf//jIVlWosJJ1hA3YyfZy5cvEwAaMGCAUbdT2eTk5NDmzZvJxcVF\nK7H6+fnRiRMnLPp8+YiICNq8ebNJtnX8+HGt6RXN6XLWrOKsPskWHg9rbueZW6Lk5GSaMmVKkTLA\n6NGj6d69e3KHZxCPHj2ievXq0datW426nXv37lHDhg2l1/DcuXNG3R6Th9Un2eeee47rsBWg0Wgo\nKiqKevXqpZVUHRwcaOXKlRZZBihNQkICNWnSxKjTF+bk5NDIkSOl1/KXX36x6F4/K51VJ9nvv/+e\nANDOnTuNsn5rlZOTQ5s2bSJnZ2etxOrv70/h4eFWmxByc3Olfc3OzjbKNn777TdpG2+99ZbV/SfF\nirLaJFtQh/3Pf/5j8HVbo+TkZJo8eXKRMsBnn31mNWUAXQrG7sbFxRl83QXzFQOgmjVr0u3btw2+\nDWaerDLJZmZmch1Wh4IyQOHhQgCoatWqtGrVKsrKypI7RJP6+++/CQAtWbLEoOtNS0ujbt26Sa/v\ngQMHDLp+Zv6sMsk2atSI67DFyMnJoY0bN5KTk5NWYu3UqZNVlwF0SUhIIBcXF4Me6FKr1TRnzhzp\nNf7qq694IqJKyuqSbMEHe9euXQZbpyVLSkqiiRMnFikDfP7555SQkCB3eGZh2bJlNHr0aIOtLyws\nTHqdO3TowEOyKjmrSrKXLl0iAPT6668bZH2WSKPR0NmzZ6l79+5aSbVatWq0evXqSlcS22wpAAAQ\nf0lEQVQG0CU9PZ327t1rkHXdvXuXnn32Wek1N9WJDMy8WU2Srcx12OzsbNqwYQPVqlVLK7F27tyZ\nTp06VWnLAPrYunVrhV+f7Oxs+uijj6TXffXq1fyaM0lpSdaiLj/TrFkzAEBSUpLZXHfJmJKSkjBh\nwgQIIeDo6IihQ4fi8ePH+OKLL5CQkAAiQlhYGHx8fMx28hU5ERH69+8PNze3cr8+RIRNmzbB0dER\nP//8M4YNG4bMzEy8++67/JozvVjMhRRnz56Nu3fvYteuXahTp47c4RgFEeHs2bMYP348Dh8+LC2v\nXr06QkJC8MYbb8DR0VHGCC3L//73P9y4cQMvvvhiuZ4fGxsrzej2zDPP4OLFi2jUqJGOZzH2lJK6\nuIa+oQLlgujoaAJAgwYNKvc6zFV2djatX7++SBkgICCAIiMj+SdpOb322msEgG7cuFHm56amplLX\nrl2l9+Lvv/82QoTMmsCSa7LWWIdNTEykcePGFRkNMGbMGL5UjgFs3ryZANDy5cvL9Dy1Wk0zZsyQ\n3o9vvvmGh2QxvVh0km3QoAEBoKSkpHI93xxoNBo6ffo0BQYGaiXVGjVq0K+//mq00zsro3v37hEA\n8vDwKNPzjh49Kr0vvr6+9PDhQyNFyKxRaUnWrGuys2fPxr1797B7926Lq8Pm5ORgy5YtGDlyJNLT\n06XlgYGB+P7779G+fXs+cGJgubm5GDBgALy9vXHs2DG9nnPv3j14eXkhMTERAHDx4kW0adPGmGGy\nyqak7GvoG8rYk7XEOmxiYiKNGTOmSBlg7NixXAYwgUmTJpGnp6deP/GzsrLogw8+kN6jtWvXcv2b\nEVHeJELr16+nb7/9llavXk1BQUF0/fr1Up8DSysXWEodVqPRUGRkJAUEBGgl1Zo1a9K6deu4DGBC\nGo2G5syZo3OiG41GQ+vXr5feq//+97988gbTcubMGemA9MqVK+nw4cM6Z1KzuCRbcEZNcnKy3s8x\nlezsbFq7di1Vr15dK7EGBgbS6dOnuTckk0OHDumsoxacLQiAXFxc6M6dOyaKjlmi0aNHa41O2b59\ne4nXristyZrdiP5Zs2YhISEBf/31F1xdXeUOBwCQmJiIL7/8Ujop4L///S8yMjIwfvx4JCYmgohw\n+PBhrrPK5MSJE6hTpw5q165d7OOpqano3LkzWrduDQA4fPgwUlJS0LBhQ1OGySxEZGQkUlJSEB0d\njcaNGyMsLAyJiYlYs2ZNQYexTMwqyUZHR2Py5MkYPHgwevfuLVscRITIyEgEBARACIH69etj4cKF\nqFWrFtavX4/s7GwQEebMmYO6devKFmdppk+fjjZt2uDFF19Eu3btEBkZCQBYuHAhsrKyDLKN2NhY\n+Pn5wdHREfPmzTPIOsvq8OHDeO2119C4ceMij6nVakyfPh21a9fG8ePH8e233yI3N9col6Jn1mPv\n3r3YunUrOnXqhG3btgEA6tWrV+6TWsymXCB3HTYrK4vWrFlD1apV0yoDdO/enc6cOWNRZYATJ06Q\nn58fKZVKIiJ68OCBVKt0d3enlJQUg2wnKSmJIiMjaerUqTR37lyDrLMsYmNjqU6dOsVOXxgaGiq9\nh/7+/vTo0SOTx8esS3BwMMXHxxf7GCyhXFDQE0lOTjbZvAT379/HF198ASEEqlatinfffReZmZmY\nOHEikpKSQET4+++/4eXlZVFlgPv378PV1RV2dnYAAGdnZzz77LNYvHgx7t27h27duqFHjx4AgP37\n98Pf3x/t27fH4MGDkZGRAQBwd3fHxIkToVAo4Ovri+vXrxfZTp06ddChQwdpO6Z09+5dtGzZEu3a\ntcN//vMfreV16tSReqvR0dE4fvw4nJycTB4jsx5JSUm4cuWK1unueisp+xr6hlJ6stOnTycA9Ndf\nf5Xvvxg9aTQaOnXqFHXu3Fmrt+rk5EQbN260mtEA6enp5OnpSc2bN6egoCA6cuSI9Ji7u7s092ly\ncjIFBARIR05nzZpF06ZNk9rNmDGDiIjWrl1Lffv2LXF7wcHBJu3JqlQq6b3LyckhorxfIu+//760\nfN26dRb164NZNpjz6IKLFy8SAHrzzTcNu9f5srKyaPXq1VS1alWtxNqzZ086e/as1X4R1Wo1hYaG\n0tdff03169en1atXE5F2kt25cye5urqSp6cneXp6koeHBw0fPlxqd/PmTSIiUiqV5OLiUuK2TJ1k\nP/nkEwJA165dI41GQ7/++qv0vr7//vs8JIuZXGlJVtYzvjIzM9G2bVsAwPr16w223vv372PmzJlY\nvHix1vJJkyZhzJgxFnf2WHnY2Niga9eu6Nq1K9q2bYs1a9bg3XffLdKuV69e2LBhg871mUu5ZN++\nfdi4cSPi4+ORmpoqlZbq1q2Ls2fPws3NTeYIGdMma03WUHVYIsKpU6fQqVMnCCGk+mPt2rWxceNG\n5OTkgIgwc+bMSpFgr169iri4OOl+VFQU3N3dAQA1a9bE48ePAQC+vr44fvy4VG/NyMjQet7mzZul\nf/39/UvcHpVjWEt5EBHGjRuHpUuX4o033pBOfz1y5AgSExM5wTLzVFIX19A3PFUu+O677whAuS8L\nkpWVRatWrSJHR0etMkCvXr0oKirKassA+jhz5gz5+/uTh4cHKRQKGjhwoFQiWLJkCbVo0YK6d+9O\nRHmD+L29vUmhUJBCoaCdO3cSUV65YOLEiaRQKMjHx6fY0woTEhKoYcOGVKtWLXJycqJGjRrRkydP\njLZfly5dolGjRknv9fTp03mWLGYWYG412QsXLpSrDnvv3j369NNPi8wNMHnyZLM8O8ySFa7dmoPd\nu3dL73eXLl14SBYr0d69e+nQoUOUlpZmsm2WlmQFmeinnhCCiAiZmZmoXr06gLzB4qWVCSi/DDBm\nzBicPHlSWu7s7IyQkBAMGDAA9vb2Ro+9MmrSpAlOnz4NZ2dno6w/KSkJW7Zsgbe3NxQKBRwcHIpt\nFx8fj7Zt2yI1NRUAcPnyZelqBYwVZ+DAgdi9ezc0Gg3q1q0LHx8fBAYGwsfHB56enka5uogQAkRU\n7IELnUlWCNEbwEIAtgBWENHsYtosBtAHQCaA94goqpg2RESoW7cukpOTkZKSAhcXlyLby8rKwsaN\nGzFq1CgolUpp+UsvvYQ5c+ZAoVCYzUEYVn7Xr19HixYtUL16dWRlZcHd3R2dO3dGly5d4O3tjZYt\nW+K7777DN998AyDvAN2+ffv4vZcJEUGtVkOtViM3N1fr39KW5ebmQqlUIicnR/r36Vtxy/VdVtwt\nLS2tSPyOjo6ws7NDRkYG3N3d8b///Q/vv/++wV6f0pJsqaMLhBC2AJYC6AngLoBIIcQOIoop1OYV\nAC8QUTMhhC+AEAAdi1vfd999h+TkZOzbt08rwd67dw8zZszAsmXLtNpPnToVX3zxhdnMYaBLaGio\n1Z+yaah9dHR0hIODg3QQLi4uDnFxcfjtt98ghIBSqUT9+vVha2uLunXrYuHChRXe5tMKEkfhBHHk\nyBH4+fnpTCRPf+FLSwDlSSLZ2dlaj6lUKuTk5ECj0Rj8dagM7OzsoFKp4OzsDIVCIR0INgVdQ7h8\nAFwjolsAIITYBKA/gJhCbV4DsAYAiOiUEMJJCFHv/9s7uxCpyjiM/5752lVw25ZdRLRWCOkLEovS\nSlndWDVvlLoIiyDqohsjFOkLzL2p8CZiQS2kvNQLu5EQlyKliN1QyI8+BJXwI2VJK4icwXHm38Wc\nM81O7s4Z95w5M+v7g8N533PemXn+nPM+c877cY6ZjVV/2ZYtW1i/fj0DAwOMjIywadMmRkdHy/u7\nu7vZsWMHa9eubclmgKhNtvpqorLS+2m/MlZePfjpfD5fzvvpXC5HNpsll8tx7do1stnsuKW6sp87\nd46urq7yd1QuvrZCoUCxWKRQKNQ98sCfcQZw/vx5AC5fvlx+uMvtTjKZJJPJkMlkaGtrq7ncrNyR\nI0fo7+8PVNZf0uk0qVSKVCpFMpkkmUyW07W2NfruY+PGjQwNDZFKpZgzZw79/f0MDAywdOnSWF6E\nWctk5wIXKvIXgcUByswD/meyAPv27WPPnj3l/KpVq9i2bdu4ZoBiscj169fLxlF9u1G5rjSVagPx\ny2Wz2bKB+OtcLjduqTalagOpvKLxTaRYLFZ27AGUb2+nM/5bBKLGPx8SiQSdnZ309PTQ29tLR0fH\nhIZQz/Zq40ilUgwNDbF58+ZJDSQO4wiTwcFBBgcH45YRGevWrWNsbIzt27dP+GS2RlLLZINehlSf\ncRN+Lp/Pj8sPDw8zPDwc8GdaC0lIIpFIkEgkxlVWv8Km02nS6TSZTKa8zmQy5dvp9vZ22tvbmTFj\nRjlfva4u4xtKOp0el/d/w/9sW1tb3cYRVgUtFAqkUv+dfpKYNWsWuVyOnp4eVqxYwcqVK1m2bBm9\nvb0NM7XOzk73CMQWp6+vj0OHDjWFwUKNji9JS4BBM1vt5d8GipWdX5I+Bg6b2V4vfwroq24ukNSY\nYQwOh8MRA7fU8QUcBRZImg9cAp4D1leV2Q9sAPZ6pvzXzdpjJxLgcDgc05lJTdbMbkjaAAxTGsL1\nqZn9IulVb/8nZnZA0hpJZ4B/gPDGRTgcDkeL07DJCA6Hw3E7EvoDYiStlnRK0mlJb05QZsjbf1zS\norA1RE2tGCW94MV2QtJ3kh6KQ+etEuQYeuUelXRD0jON1BcGAc/T5ZJ+kPSjpMMNljhlApyn3ZIO\nSjrmxfhSDDJvGUmfSRqTdHKSMvF7zUTzbW9lodSkcAaYD6SBY8D9VWXWAAe89GJgNEwNUS8BY3wc\nuMNLr26lGIPEV1Hua+AL4Nm4dUdwDDuBn4B5Xr47bt0RxDgIfODHB1wFUnFrryPGZcAi4OQE+5vC\na8K+ki1PXjCzPOBPXqhk3OQFoFPS7JB1REnNGM1sxMz8uX3fUxo33CoEOYYArwH7gN8bKS4kgsT4\nPPC5mV0EMLMrDdY4VYLEeBno8NIdwFUzu9FAjVPCzL4F/pykSFN4Tdgme7OJCdUP+Zxo8kKrECTG\nSl4BDkSqKFxqxidpLqUKu9Pb1GoN+0GO4QKgS9IhSUclvdgwdeEQJMZdwIOSLgHHgdcbpK1RNIXX\nhP1mhNAnLzQhgbVKWgG8DDwZnZzQCRLfR8BbZmYqzRJoteF5QWJMAw8DTwEzgRFJo2Z2evKPNQ1B\nYnwHOGZmyyXdA3wpaaGZ/R2xtkYSu9eEbbK/AZWTg++i9O8xWZl53rZWIUiMeJ1du4DVZjbZLU2z\nESS+RyiNi4ZSW97TkvJmtr8xEqdMkBgvAFfMLAtkJX0DLARaxWSDxPgE8B6AmZ2V9CtwL6Xx8dOB\n5vCakBuiU8BZSo3tGWp3fC2hhTqF6ojxbkqdDkvi1htFfFXldwPPxK07gmN4H/AVpQ6kmcBJ4IG4\ntYcc44fAVi89m5IJd8Wtvc445xOs4ys2rwn1StZug8kLQWIE3gXuBHZ6V3t5M3ssLs31EDC+libg\neXpK0kHgBFAEdpnZz/Gpro+Ax/F9YLek45T6Z94wsz9iE10nkvYAfUC3pAvAVkrNPE3lNW4ygsPh\ncERIrG+rdTgcjumOM1mHw+GIEGeyDofDESHOZB0OhyNCnMk6HA5HhDiTdTgcjghxJutwOBwR4kzW\n4XA4IuRftgEa0hANsIIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x84dc3c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "def unit(*args):\n",
    "    squared = map(lambda x: x**2, args)\n",
    "    distance = sum(squared) ** (.5)\n",
    "    return map(lambda x: x / distance, args)\n",
    "\n",
    "f, ax = plt.subplots(nrows=3, figsize=(5, 10))\n",
    "plt.tight_layout()\n",
    "ax[0].set_ylim(0, 1.1)\n",
    "ax[0].set_xlim(0, 1.1)\n",
    "\n",
    "x, y = unit(1, 0.02)\n",
    "ax[0].arrow(0, 0, x, y, edgecolor='black', facecolor='black')\n",
    "ax[0].text(x + .05, y + .05, r\"$x_1$\")\n",
    "\n",
    "x, y = unit(.5, 1)\n",
    "ax[0].arrow(0, 0, x, y, edgecolor='black', facecolor='black')\n",
    "ax[0].text(x + .05, y + .05, r\"$x_2$\")\n",
    "\n",
    "x, y = unit(1, .45)\n",
    "ax[0].arrow(0, 0, x, y, edgecolor='black', facecolor='black')\n",
    "ax[0].text(x + .05, y + .05, r\"$y$\")\n",
    "\n",
    "ax[0].set_title(\"No steps\")\n",
    "\n",
    "#step 1\n",
    "ax[1].set_title(\"Step 1\")\n",
    "ax[1].set_ylim(0, 1.1)\n",
    "ax[1].set_xlim(0, 1.1)\n",
    "\n",
    "x, y = unit(1, 0.02)\n",
    "ax[1].arrow(0, 0, x, y, edgecolor='black', facecolor='black')\n",
    "ax[1].text(x + .05, y + .05, r\"$x_1$\")\n",
    "\n",
    "x, y = unit(.5, 1)\n",
    "ax[1].arrow(0, 0, x, y, edgecolor='black', facecolor='black')\n",
    "ax[1].text(x + .05, y + .05, r\"$x_2$\")\n",
    "\n",
    "x, y = unit(.5, 1)\n",
    "ax[1].arrow(.5, 0.01, x, y, ls='dashed', edgecolor='black', facecolor='black')\n",
    "ax[1].text(x + .5 + .05, y + .01 + .05, r\"$x_2$\")\n",
    "\n",
    "ax[1].arrow(0, 0, .47, .01, width=.0015, edgecolor='black', facecolor='black')\n",
    "ax[1].text(.47-.15, .01 + .03, \"Step 1\")\n",
    "\n",
    "x, y = unit(1, .45)\n",
    "ax[1].arrow(0, 0, x, y, edgecolor='black', facecolor='black')\n",
    "ax[1].text(x + .05, y + .05, r\"$y$\")\n",
    "\n",
    "#step 2\n",
    "ax[2].set_title(\"Step 2\")\n",
    "ax[2].set_ylim(0, 1.1)\n",
    "ax[2].set_xlim(0, 1.1)\n",
    "\n",
    "x, y = unit(1, 0.02)\n",
    "ax[2].arrow(0, 0, x, y, edgecolor='black', facecolor='black')\n",
    "ax[2].text(x + .05, y + .05, r\"$x_1$\")\n",
    "\n",
    "x, y = unit(.5, 1)\n",
    "ax[2].arrow(0, 0, x, y, edgecolor='black', facecolor='black')\n",
    "ax[2].text(x + .05, y + .05, r\"$x_2$\")\n",
    "\n",
    "x, y = unit(.5, 1)\n",
    "ax[2].arrow(.5, 0.01, x, y, ls='dashed', edgecolor='black', facecolor='black')\n",
    "ax[2].text(x + .5 + .05, y + .01 + .05, r\"$x_2$\")\n",
    "\n",
    "ax[2].arrow(0, 0, .47, .01, width=.0015, edgecolor='black', facecolor='black')\n",
    "ax[2].text(.47-.15, .01 + .03, \"Step 1\")\n",
    "\n",
    "## step 2\n",
    "x, y = unit(1, .45)\n",
    "ax[2].arrow(.5, .02, .4, .35, width=.0015, edgecolor='black', facecolor='black')\n",
    "ax[2].text(x, y - .1, \"Step 2\")\n",
    "\n",
    "x, y = unit(1, .45)\n",
    "ax[2].arrow(0, 0, x, y, edgecolor='black', facecolor='black')\n",
    "ax[2].text(x + .05, y + .05, r\"$y$\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "具体过程是，我们把$x2$沿着$x1$方向移动到一个位置：$x1$与$y$的点积与$x1$与$y$的点积相同。到了这个位置之后，我们再沿着$x1$和$x2$夹角的一半的方向移动。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## There's more..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "和我们前面用交叉检验来优化领回归模型一样，我们可以对LARS做交叉检验："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\Miniconda3\\lib\\site-packages\\sklearn\\linear_model\\least_angle.py:285: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 168 iterations, i.e. alpha=2.278e-02, with an active set of 132 regressors, and the smallest cholesky pivot element being 6.144e-08\n",
      "  ConvergenceWarning)\n",
      "d:\\Miniconda3\\lib\\site-packages\\sklearn\\linear_model\\least_angle.py:285: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 168 iterations, i.e. alpha=2.105e-02, with an active set of 132 regressors, and the smallest cholesky pivot element being 9.771e-08\n",
      "  ConvergenceWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "LarsCV(copy_X=True, cv=None, eps=2.2204460492503131e-16, fit_intercept=True,\n",
       "    max_iter=500, max_n_alphas=1000, n_jobs=1, normalize=True,\n",
       "    precompute='auto', verbose=False)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LarsCV\n",
    "lcv = LarsCV()\n",
    "lcv.fit(reg_data, reg_target)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用交叉检验可以帮助我们确定需要使用的非零相关系数的最佳数量。验证如下所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "43"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sum(lcv.coef_ != 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "说实话，LARS的精髓还没有领会，抽空会把原文译出来，看各种解释不如看原文。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[1] Efron, Bradley; Hastie, Trevor; Johnstone, Iain and Tibshirani, Robert(2004). \"[Least Angle Regression](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB4QFjAAahUKEwjJ3I3ljbDHAhWJlYgKHU2iApA&url=http%3A%2F%2Fweb.stanford.edu%2F~hastie%2FPapers%2FLARS%2FLeastAngle_2002.pdf&ei=ItLRVcnDEImrogTNxIqACQ&usg=AFQjCNFDP4Zjp-cPndzpNhq_8WOwrrui7g&sig2=eNxVG-ZIjnsme93zOTFROw&bvm=bv.99804247,d.cGU)\". Annals of Statistics 32(2): pp. 407–499.doi:10.1214/009053604000000067. MR 2060166."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
